详细讲解详细讲解Java的泛型的泛型
主要介绍了Java的泛型,是Java入门学习中的基础知识,需要的朋友可以参考下
我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。
假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如:
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();