泛型(generic):
泛型是JDK1.5版本推出一个安全机制。泛型的本质是参数化类型。早期程序设计为程序扩展性,一般使用Object来实现参数传递的任意化,但是需要进行强制类型转换,这种转换是在对传递的参数类型已知的情况下进行的,如果强制转换类型错误,在编译时期是没有问题的,但是在运行时期会出现ClassCastException异常,这就产生了安全隐患。泛型的好处就是将运行时期出现的问题ClassCastException转移到了编译时期,避免了类型强转的麻烦。
泛型可以在接口、类、方法中使用,分别是泛型接口、泛型类、泛型方法。可以将要操作的引用类型作为参数传递到<>中,当类或接口中操作的引用数据类型不确定的时候使用,而方法操作的引用类型不确定而且每个方法操作的类型可能不一致,这是就要将泛型定义在方法上,需要注意的是必须定义在返回值类型前面,通常在静态函数中使用。泛型的参数可以为多个,还可以使用extends语句和通配符,但是使用的情况不多,例如<? extends K>可以接收K类型的对象或者K类型的子类对象<? super K>可以接收K类型的对象或者K类型的父类对象。
例:
import java.util.*;
public class TestGeneric {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("df");
al.add("qwee");
//al.add(18); 通过泛型规定只能添加String类型的元素,这样添加Integer类型会报错
al.add("abc");
for(Iterator<String> it = al.iterator();it.hasNext();){
String str = it.next(); //不使用泛型需要写为String str = (String)(it.next());
System.out.println(str);
System.out.println(str.length());
}
PP<Man> p = new PP<Man>();
p.sett(new Man()); //因为指定了泛型,往里面传其他类型对象会报错,没泛型之前只会在编译时期报错
Man m = p.gett();
m.work();
}
}
class PP<T>
{
private T t;
public void sett(T t)
{
this.t = t;
}
public T gett()
{
return t;
}
}
class Man{
public void work(){
System.out.println("man work");
}
}
class Women{
public void work(){
System.out.println("Women work");
}
}