小说网站 搜小说 无限网 烟雨红尘 小说爱好者 免费小说 免费小说网站

《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类型的的
	}
}


解决了编译时期就能判别类型错误的情形。



posted on 2016-05-26 22:58  王小航  阅读(146)  评论(0编辑  收藏  举报

导航