JDK5引入了泛型,在新代码里应优先使用泛型替代原始类型(raw type)
泛型相关术语:
List<E> | generic type | 泛型 |
E | formal type parameter | 形式参数 |
List<String> | parameterized type | 参数化类型 |
String | actual type parameter | 实际参数 |
List | raw type | 原始类型 |
List<?> | unbounded wildcard type | |
<E extends Number> | bounded type parameter | |
<E super Number> | bounded type parameter | |
<T extends Comparable<T>> | recursive type bound | |
<? extends Number> | bounded wildcard type | |
<E> List<E> asList(E[] a) | generic method | |
String.class | type token |
泛型用于在编译时检查数据类型,或自动转换数据类型。在运行时,泛型会被替换为实际的类型,即在运行时,只存在List.class,不存在List<String>.class这样的类型。这称为类型擦除
注1:编译器使用type inference确定泛型的实际参数类型
注2:可以通过反射获取类似List<String>这样的“声明”,但是不能获取List<String>.class类型的对象
如果不希望限制类型,仍然建议使用List<Object>替代原始类型List
List<?>表示不清楚List里的元素类型,不能向此类型的List里添加任何元素,以下 代码编译不通过:
List<?> list=new ArrayList<String>();
list.add("bingo");//提示错误
List<? extends Hello>表示List里包含Hello或其子类类型的元素,List<? super Hello>表示List里包含Hello或其父类类型的元素。extends、super用于限定泛型参数范围
使用泛型可以减少类或方法的声明,如下2个方法,可以使用1个泛型方法替代:
public int getValue(int value){
return value;
}
public String getValue(String value){
return value;
}
//泛型方法,可替代以上方法
public <T> T getValue(T value){
return value;
}