现在的位置: 首页 > 编程技术 > Java > 正文

泛型的由来及一般用法

2015年10月31日 Java ⁄ 共 3154字 ⁄ 字号 泛型的由来及一般用法已关闭评论 ⁄ 阅读 398 次

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。

1.泛型的引入:

为什么要用泛型?

比如现在要设计一个坐标的方法

坐标有几种表示方法:
1.整数:x=20,y=20
2.小数:x=20.2,y=20.2
3.字符串:x=东京180,y="北纬210"

看到这里我们是不是在想,要建立一个point类是,里面定义一个方法,来接收这三种数据,但是数据有三种,那么就只有用Object来接收了。因为Object可以接收任何数据,发生向上转型。。。

//整数接收
class Point{
private Object x;

private Object y;

public Object getX() {
return x ;
}

public void setX(Object x) {
this .x = x;
}

public Object getY() {
return y ;
}

public void setY(Object y) {
this .y = y;
}

}
public class PointTest {

public static void main(String[] args) {
Point point= new Point();
//整数接收
point.setX(20);

point.setY(20);

int x=(Integer)point.getX();

int y=(Integer)point.getY();

System. out .println("x坐标:" +x);

System. out .println("y坐标:" +y);
}
}

结果:
x坐标:20
y坐标:20

//小数接收

class Point{
private Object x;

private Object y;

public Object getX() {
return x ;
}

public void setX(Object x) {
this .x = x;
}

public Object getY() {
return y ;
}

public void setY(Object y) {
this .y = y;
}



}
public class PointTest {

public static void main(String[] args) {
Point point= new Point();
//整数接收
point.setX(20.2);

point.setY(20.2);

double x=(Double)point.getX();

double y=(Double)point.getY();

System. out .println("x坐标:" +x);

System. out .println("y坐标:" +y);
}
}

结果:
x坐标:20.2
y坐标:20.2

//字符转接收

class Point{
      private Object x;
     
      private Object y;

      public Object getX() {
           return x ;
     }

      public void setX(Object x) {
           this .x = x;
     }

      public Object getY() {
           return y ;
     }

      public void setY(Object y) {
           this .y = y;
     }
     
     
     
}


public class PointTest {
     
      public static void main(String[] args ) {
          Point point= new Point();
           //整数接收
          point.setX( "东经120" );
          
          point.setY( "北纬60" );
          
          String x=(String)point.getX();
          
          String y=(String)point.getY();
          
          System. out .println("x坐标:" +x);
          
          System. out .println("y坐标:" +y);
     }
}

结果:
x坐标:东经120
y坐标:北纬60
好像这样是实现了我们想要的结果,那么来看看这段代码:

class Point{
      private Object x;
     
      private Object y;

      public Object getX() {
           return x ;
     }

      public void setX(Object x) {
           this .x = x;
     }

      public Object getY() {
           return y ;
     }

      public void setY(Object y) {
           this .y = y;
     }
     
     
     
}


public class PointTest {
     
      public static void main(String[] args) {
          Point point= new Point();
           //整数接收
          point.setX(123);
          
          point.setY( "北纬60" );//这里是用Object来接收的,所以可以接收任何类型
          
           int x=(Integer)point.getX();
          
           int y=(Integer)point.getY();
          
          System. out .println("x坐标:" +x);
          
          System. out .println("y坐标:" +y);
     }
}

结果:
Exception in thread "main" java.lang.ClassCastException : java.lang.String cannot be cast to java.lang.Integer
at test.PointTest.main( PointTest.java:42 )
所以,这样为们才有了现在的泛型,泛型代码:

class Point1{//声明一个泛型类
          
      private  T  var; //声明一个泛型变量
     
      private T  Yar;

      public T getVar() {
           return var ;
     }

      public void setVar(T var) {
           this .var = var;
     }

      public T getYar() {
           return Yar ;
     }

      public void setYar(T yar) {
           Yar = yar;
     }
     
     
}


public class PointTest1 {
     
           public static void main(String[] args) {
              Point1 point= new Point1();
              point.setVar(20);
              point.setYar( "北纬" );
                   System. out .println("x坐标" +point.getVar());
                   System. out .println("y坐标" +point.getYar());
              
          }
}

结果:
x坐标20
y坐标北纬
2.泛型的构造方法

class Point1{//声明一个泛型类
          
      private  T  var; //声明一个泛型变量
     
      private T  Yar;

      public T getVar() {
           return var ;
     }

     
     
      public Point1(T var, T yar) {
           this .var = var;
           Yar = yar;
     }



      public void setVar(T var) {
           this .var = var;
     }

      public T getYar() {
           return Yar ;
     }

      public void setYar(T yar) {
           Yar = yar;
     }
     
     
}


public class PointTest1 {
     
           public static void main(String[] args) {
              Point1 point= new Point1(20,"北纬" );
               //point.setVar(20);
           //   Point1 point1=new Point1();
           //   point.setYar("北纬");
                   System. out .println("x坐标" +point.getVar());
                   System. out .println("y坐标" +point.getYar());
              
          }

}

结果:
x坐标20
y坐标北纬

抱歉!评论已关闭.