读编写高质量代码整理(八)

java的泛型是类型擦除的。

java泛型加强了参数类型的安全性,减少了类型转换,它与C++模板(template)非常类似,有不同,java的泛型在编译器有效,在运行期被删除。

import java.util.List;
public class Foo {
	//overload
	public void arrayMethod(String[] strArray) {
		
	}
	public void arrayMethod(Integer[] intArray) {
		
	}	
	//overload
	public void listMethod(List<String> stringList) {

	}
	
	public void listMethod(List<Integer> intList) {

	}
	
}

 编译后:
读编写高质量代码整理(八)
 我们知道方法的重载类型应不同,我们得出的结论是List<Integer>和List<String>的类型是相同的。

我们做个测试

List<String> ls = new ArrayList<String>();
List<Integer> li = new ArrayList<Integer>();
System.out.println(ls.getClass() == li.getClass());

 结果为:true

这边是java泛型引起的问题,在编译后所有的泛型做相应的转化。准换规则如下:

List<String>、List<Integer>、List<T>擦除后的类型是List

推而广之,List<String>[]、List<Integer>[]擦除后的类型为List[]

List<? extends E>,List<? super E>擦除后的类型为List<E>

所以泛型数组初始化时不能声明泛型类型,因为他们的擦除后类型相同。

List list  = new ArrayList<String>();

list instanceof list<String>此类的表达都不能通过编译,因为泛型类型被擦除了。 

 

你可能感兴趣的:(java,泛型,generic,擦除,泛型数组)