先上一段代码,猜猜会出现的问题
public void test(List<String> value){
System.out.println("List<String> value");
}
public void test(List<Integer> value){
System.out.println("List<Integer> value");
}
很,不幸编译不通过,下面让我们来分析一下为什么。
真假泛型,早在java出现泛型之前,c#中存在泛型了,c#中的泛型无论在源码中还是编译后都是真实存在的(编译后是一个占位符),基于这种实现的泛型我们称之为真泛型。那么java呢,java的泛型只是存在源码中,javac编译后字节码中就被替换成原生类型,所以运行阶段List<String>与 List<Integer> 是同一类型,基于这种泛型实现的我们称之伪泛型。那么运行时类型是如何区分的呢,其实编译阶段在相应地方插入了强制转化类型代码。java中泛型实现方法称为泛型擦除。