java泛型详解

来源:互联网 发布:易企秀场景制作源码 编辑:程序博客网 时间:2024/06/05 11:10

我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。

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

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

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

int --> Integer --> Objectdouble -->Double --> ObjectString --> 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度

与普通类的定义相比,上面的代码在类名后面多出了

0 0
原创粉丝点击