您的位置:首页 > 编程语言 > Java开发

java泛型详解

2015-10-21 22:50 344 查看
我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。

假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如:

x = 10、y = 10
x = 12.88、y = 129.65
x = "东京180度"、y = "北纬210度"


针对不同的数据类型,除了借助方法重载,还可以借助自动装箱和向上转型。我们知道,基本数据类型可以自动装箱,被转换成对应的包装类;Object 是所有类的祖先类,任何一个类的实例都可以向上转型为 Object 类型,例如:

int --> Integer --> Object
double -->Double --> Object
String --> Object


这样,只需要定义一个方法,就可以接收所有类型的数据。请看下面的代码:

public class Demo {
public static void main(String[] args){
Point p = new Point();
p.setX(10);  // int -> Integer -> Object
p.setY(20);
int x = (Integer)p.getX();  // 必须向下转型
int y = (Integer)p.getY();
System.out.println("This point is:" + x + ", " + y);

p.setX(25.4);  // double -> Integer -> Object
p.setY("东京180度");
double m = (Double)p.getX();  // 必须向下转型
double n = (Double)p.getY();  // 运行期间抛出异常
System.out.println("This point is:" + m + ", " + n);
}
}
class Point{
Object x = 0;
Object y = 0;
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;
}
}


上面的代码中,生成坐标时不会有任何问题,但是取出坐标时,要向下转型,在 Java多态对象的类型转换 一文中我们讲到,向下转型存在着风险,而且编译期间不容易发现,只有在运行期间才会抛出异常,所以要尽量避免使用向下转型。运行上面的代码,第12行会抛出 java.lang.ClassCastException 异常。

那么,有没有更好的办法,既可以不使用重载(有重复代码),又能把风险降到最低呢?

有,可以使用泛型类(Java Class),它可以接受任意类型的数据。所谓“泛型”,就是“宽泛的数据类型”,任意的数据类型。

更改上面的代码,使用泛型类:

public class Demo {
public static void main(String[] args){
// 实例化泛型类
Point<Integer, Integer> p1 = new Point<Integer, Integer>();
p1.setX(10);
p1.setY(20);
int x = p1.getX();
int y = p1.getY();
System.out.println("This point is:" + x + ", " + y);

Point<Double, String> p2 = new Point<Double, String>();
p2.setX(25.4);
p2.setY("东京180度");
double m = p2.getX();
String n = p2.getY();
System.out.println("This point is:" + m + ", " + n);
}
}
// 定义泛型类
class Point<T1, T2>{
T1 x;
T2 y;
public T1 getX() {
return x;
}
public void setX(T1 x) {
this.x = x;
}
public T2 getY() {
return y;
}
public void setY(T2 y) {
this.y = y;
}
}


运行结果:

This point is:10, 20

This point is:25.4, 东京180度

与普通类的定义相比,上面的代码在类名后面多出了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: