基本概念
泛型是JDK1.5后引进的一种机制。
如果除去对象的基本类型外,其实现的方法是相同的,那么就可以用泛型机制来描述该功能。
可以看成是一种安全机制,主要应用于在编译期发现类型转换异常ClassCastException,以减少麻烦的“运行时异常”。
类型檫除与补偿
编译时会将泛型的类型转换为非泛型类(即该泛型的原始类),该过程称为“泛型擦除”。
例如:List,List都会转换为List。
ArrayList,ArrayList都会转换为ArrayList。
那泛型被檫除后,又如何完成隐式地类型转换呢?
泛型被转换为原始类时,并不是把所有类型信息完全地去除,编译器会保留一些泛型类型信息,用于实现类型的隐式转换。这个过程就叫做“补偿”。
通配符
泛型中可用“?”来表示未知的具体类型实参。
通配符上限:”? extends anyclass “ 表示 该类及其子类。
通配符下限:”? Super anyclass “ 表示 该类及其父类。
注:
通配符,在某种程度上说,是为了弥补泛型的不足。
何为泛型的不足呢?
上文提到的类型檫除与补偿就是关键。例如:
假设Person类是Student类的父类。
那 List<Student>
IS-A List<Person>
吗?逻辑上是,但实际上不是。
List<Person> = List<Student>
;
该语句会出现编译错误,虽然二者都会被檫除为List,但它们各自会保留本身的一些类型信息,所以二者是不同类型,不存在父与子的关系。
这种做法虽然保证了泛型的安全性,但是却失去了其灵活性。通配符的引入就是为了解决这个问题。
泛型应用(举例说明)
泛型接口
public interface List <E>
{
void add(E x);
Iterator<E> iterator();
}
泛型类与方法
class Box<T> {
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
尖括号中包含的是形式类型参数(formal type parameters),它们就如同一般的类型一样,可以在整个类的声明中被使用。当类被使用时,会使用具体的实际类型参数(actual type argument)代替。
泛型注意事项
1.不能创建一个泛型类的实例
2.不能创建一个确切泛型类型的数组。
3.泛型类中的static 域是该泛型实例共享的。
4.不能创建一个泛型的数组。