Java泛型
解耦类或方法与类型之间的约束。
泛型出现的一个原因:容器类
泛型类
只能持有单个对象的类
如何持有别的类型的对象?使用object
通常来说,我们只持有一种类型的对象,泛型的目的是指定持有哪种对象。
泛型接口
Public interface Generator<T>{ T next(); }
Public class CoffeGenerator implements Generator<Coffee>{ public Coffee next();}
泛型方法
泛型方法可独立于类,尽量使用泛型方法。(Public <T> void f(T x));对于static方法,若需要使用泛型能力,就必须使其成为泛型方法,因为static发发无法访问泛型类的类型参数。
(public static <K,V> Map<K,V> map(){})
在使用泛型类时,在创建对象时必须指定类型参数,而调用方法时,无需指定,编译器会做类型参数判断,相当于重载。
调用泛型方法后,其返回值会被赋给一个Object类型的变量。
可变参数与泛型方法
public static <T> List<T> makeList(T… args){}
匿名内部类
class Teller{
public static Generator<Teller> generator(){
return new Generator<Teller>(){
public Teller next(){
return new Teller();
}
};
}
}
泛型的擦除
class c1 = new ArrayList<String>().getClass();
class c2 = new ArrayList<Integer>().getClass();
return (c1==c2)//True
在泛型代码内部,无法获得任何有关泛型参数类型的信息。使用边界信息(extends)
擦除的补偿
显示地传递class对象
局限性:
基本类型无法作为类型参数。(不过Java SE5具备自动拆包、装包功能)