泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。
java也支持泛型,List就是很好的例子。现在我们写一个支持泛型的类:
//有两个泛型参数的例子
public class Example<T, T2> {
T t;
T2 t2;
private T method(T2 t2){
return t;
}
}
泛型的使用:
Example<String, Integer> example = new Example<>();
除了泛型类之外,可以单独定义泛型方法:
public static <T> T method(T t){
return t;
}
泛型方法在定义时,参数必须要包含泛型参数的类型。
泛型可以用通配符指定,<? extends T>和 <? super T>,两者的主要区别
List<? super Animal> list;
list = new ArrayList<Object>();
List<? extends Animal> list2;
list2 = new ArrayList<Pig>();
理解这里的话重点是List<? super Animal>代表了一种限定范围了的不定类型,它可以是List<Object>也可以是List<Animal的其他父类>, extends的情况也同理。
考虑add和get的情况, super 可以add Animal和他的子类的对象,因为必然可以向上转型成 Animal的父类。get不能知道get出的是什么类型。
extends 可以get到 Animal 对象,而不能把Animal或者它的子类add进去。
另外在Java运行时,泛型是不保存类型信息的,所有的都相当于List<Object>,泛型的约束都是在编译器中。
网友评论