《java入门第一季》之泛型类引入
首先用一个例子引入泛型类。
我定义一个Object类:
package cn.it_03; public class ObjectTool { private Object obj; public Object getObj() { return obj;//obj = new Integer(30); obj = new String("林青霞"); } public void setObj(Object obj) { // Object obj = new Integer(30); 或者Object obj = new String("林青霞"); this.obj = obj;//由于接收的是object类型,所以可以接收任意类型 } }然后在另一个类里面使用上边那个类的元素,如下:
package cn.itcast_03; /* * 早期的时候,我们使用Object来代表任意的类型。 * 向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题。 * 也就是说这样的程序其实并不是安全的。所以Java在JDK5后引入了泛型,提高程序的安全性。 */ public class ObjectToolDemo { public static void main(String[] args) { ObjectTool ot = new ObjectTool(); // 正常使用 ot.setObj(new Integer(27)); Integer i = (Integer) ot.getObj();//向下转型:Integer i = new Integer(30); System.out.println("年龄是:" + i);//i=30 ot.setObj(new String("林青霞")); String s = (String) ot.getObj();//向下转型String s = new String("林青霞"); System.out.println("姓名是:" + s);//s=林青霞 //非正常使用 System.out.println("---------以上时没有问题的"); ot.setObj(new Integer(30)); // // ClassCastException String ss = (String) ot.getObj();//Integer类型转不到String类型String ss =new Integer(30)显然时错误的。 // new Integer(30);显然不正确 // System.out.println("姓名是:" + ss); } }
分析两行代码
ot.setObj(new Integer(30)); String ss = (String) ot.getObj();
明显向下转型有问题,而编译前并没有报错。因此,要洗那个办法解决这个问题。那么,泛型类站了出来。。。
代码修改如下:
自定义的类:
package cn.itcast_04; /* * 泛型类:把泛型定义在(类上)格式:public class 类名<泛型类型1,…> */ public class ObjectTool<T> { private T obj; public T getObj() { return obj;//返回new String("林青霞");或者 new Integer(27); } public void setObj(T obj) {//T(String) obj = new String("林青霞");或者T(Integer) obj = new Integer(27); this.obj = obj; } }ObjectToolDemo类的代码:
public class ObjectToolDemo { public static void main(String[] args) { ObjectTool<String> ot = new ObjectTool<String>();//给T指定了为String类型。 //ot.setObj(new Integer(27)); //这个时候编译期间就过不去 ot.setObj(new String("林青霞")); String s = ot.getObj();//String s = new String("林青霞");输出:林青霞 System.out.println("姓名是:" + s); ObjectTool<Integer> ot2 = new ObjectTool<Integer>();//要想使用Integer,再创建一个对象给T指定了为Integer类型 //ot2.setObj(new String("风清扬"));//这个时候编译期间就过不去 ot2.setObj(new Integer(27)); Integer i = ot2.getObj();//Integer i = new Integer(27) System.out.println("年龄是:" + i);//i是Integer类型的的 } }
解决了编译时期就能判别类型错误的情形。