5.23 使用泛型替代原始类型

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;
	}

 

 

 

 

你可能感兴趣的:(泛型)