泛型的概述
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
举例说明:
import java.ytil.ArrayList;
import java.util.Iterator;
class test{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("String");
a.add(100);
Iterator it =a.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}
}
}
毫无疑问,运行不了,报错:ClassCastException
这是因为遍历的时候String s = (String)it.next();这时候我们以及限定了是String类型,但是我们集合里有Integer类型,所以会报错,但是这个报错却没有提前提示,为了解决这个问题,我们引用了泛型
泛型测试:
import java.ytil.ArrayList;
import java.util.Iterator;
class test{
public static void main(String[] args){
ArrayList<String> a = new ArrayList<String>();
a.add("String");
//a.add(100);
//这个就会直接报错
Iterator<String> it =a.iterator();
while(it.hasNext()){
//前面以及明确了String,所以这里不用转型
//String s = (String)it.next();
String s = it.next();
System.out.println(s);
}
}
}
进一步测试
/**
* 这是一个泛型类
* 泛型类:把泛型定义在类上
* @author 品茶的橘子
* @version v1.0
*
*/
public class ObjectTool<T> {
private T obj;
/**
* @return the obj
*/
public T getObj() {
return obj;
}
/**
* @param obj the obj to set
*/
public void setObj(T obj) {
this.obj = obj;
}
}
/**
* 这是泛型类的测试类
* @author 品茶的橘子
* @version v1.0
*
*/
public class ObjectToolDemo {
public static void main(String[] args) {
//创建集合对象
ObjectTool<String> ob = new ObjectTool<String>();
ob.setObj(new String("张三"));
String s = ob.getObj();
System.out.println("名字:"+ s);
ObjectTool<Integer> ob2 = new ObjectTool<Integer>();
ob2.setObj(new Integer(10));
Integer i = ob2.getObj();
System.out.println("年龄:"+ i);
// ObjectTool ob = new ObjectTool();
//
// ob.setObj(new String("李四"));
// String s = (String)ob.getObj();
// System.out.println("名字:"+ s );
//
// ob.setObj(new Integer(10));
// Integer i = (Integer)ob.getObj();
// System.out.println("年龄:"+i);
}
}