5.23 使用泛型替代原始类型
JDK5引入了泛型,在新代码里应优先使用泛型替代原始类型(raw type)
?
泛型相关术语:
List<E>generic type泛型Eformal type parameter形式参数List<String>parameterized type参数化类型Stringactual type parameter实际参数Listraw 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.classtype 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;}?
?
?
?