【作者:孟祥月 博客:http://blog.csdn.net/mengxiangyue】
在写程序的时候我们可能会遇到这样的的题目:我们需要一个坐标,这个坐标可以接受int类型,float类型,String类型的数据,然后分别取得。为了实现这个功能我们很自然的想到在设计坐标类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 Demo1 { public static void main(String[] args) { Point p = new Point(); p.setX(2); p.setY(3); int x = (Integer)p.getX(); int y = (Integer)p.getY(); System.out.println("X的坐标是"+x); System.out.println("Y的坐标是"+y); p.setX(10.3f); p.setY(3.3f); float x1 = (Float)p.getX(); float y1 = (Float)p.getY(); System.out.println("X的坐标是"+x1); System.out.println("Y的坐标是"+y1); p.setX("东经43度"); p.setY("北纬34度"); String x2 = (String)p.getX(); String y2 = (String)p.getY(); System.out.println("X的坐标是"+x2); System.out.println("Y的坐标是"+y2); p.setX(2); p.setY("北纬34度"); System.out.println("X的坐标是"+(Integer)p.getX()); System.out.println("Y的坐标是"+(Integer)p.getY());//将会抛出异常 } }
这里解释一下,我们可以看出在Point类中的x和y都是Object类型的,但是我们在设置的时候直接传递的int或者float类型的,这个是因为对于基本数据类型Java提供了自动装箱和拆箱的功能具体详见Java中基本数据类型的自动拆箱和装箱。
程序的最后几行先不考虑,我们可以看出上面的代码按照我们需要的存储了我们需要的坐标,似乎实现的很好。下面我们看看程序的最后四行代码,我们本来想使xy都是int类型的,但是在程序中错误的将x设置成int类型的,y设置成Sting类型的,这个在编译的时候不会给我们报错,因为这两个类都是Object的子类。但是最后一行代码会跑出异常,因为一个String类型无法向Integer转型。可能你会说将它改成转型成String不就可以了吗?是的可以这么做,但是如果有几千个这样的数据你能记住每一个应该转成什么类型的吗。不能吧,这时候就可以使用泛型解决这个问题。
我们使用了泛型之后不用记住这些什么向上向下转型了,程序会自动完成。另外使用泛型后也不会出现上面的问题了,我们上面是输入了不合法的数据编译没错,运行出错,使用泛型之后编译就会报错。