泛型
泛型,Gernerics,本质是将原本确定不变的数据类型参数化,可提高java程序的类型安全、可维护性和可靠性
使用泛型
集合框架中的泛型
编译器负责添加元素的类型合法性检查
Example:
- 集合Vector
- 映射HashTable
泛型的向后兼容性
Xlint:unchecked编译
添加@SuppressWarnings({“unchecked”})注解
泛型进阶
- 泛型类
public class Vector<E> {
public void addElement(E obj) { /* ... */ }
public E elementAt(int index) { /* ... */ }
}
- 若使用时不指定
E
的具体数据类型,编译器将其作为Object类型处理- 同一个泛型类与不同的类型参数符合而成的类型间,不存在继承关系
类型通配符“?”
如:Vector<?>
是任何泛型Vector的父类型
作为入参,方法中不允许add()方法,但可以remove()/clear()操作泛型方法
public <T> T evaluate(T a, T b){
if(a.equals(b))
return a;
else
return null;
}
public class Test<T> {
public void m1(T t){
}
}
受限制的类型参数
- 类
// T的父类必须是Number,比如Integer、Float、Double
public class Point<T extends Number>{
}
// T的父类必须是Number,比如Integer、Float、Double
public void show(Vector<? extends Number> v){
for(Number n : v){
}
}
// T的父类必须是Number,比如Integer、Float、Double
Vector<? extends Number> va;
- 接口
// T必须实现某接口
public class Point<T extends interface>{
}