假设我们有以下泛型类
public class SomeType{ public void test(Collection collection){ System.out.println("1st method"); for (E e : collection){ System.out.println(e); } } public void test(List integerList){ System.out.println("2nd method"); for (Integer integer : integerList){ System.out.println(integer); } } }
现在在main方法中我们有以下代码片段
SomeType someType = new SomeType(); Listlist = Arrays.asList("value"); someType.test(list);
作为执行的结果,someType.test(list)
我们将在我们的控制台中获得"第二种方法" java.lang.ClassCastException
.据我所知,为什么第二种test
方法被执行的原因是我们不使用泛型SomeType
.因此,编译器会立即从类中删除所有泛型信息(即两者
和
).在做完第二个test
方法后,它将List integerList
作为一个参数,当然比to List
更好.List
Collection
现在考虑在main方法中我们有以下代码片段
SomeType> someType = new SomeType<>(); Listlist = Arrays.asList("value"); someType.test(list);
在这种情况下,我们将在控制台中获得"第一种方法".这意味着第一个测试方法正在执行.问题是为什么?
根据我对运行时的理解,由于类型擦除,我们从来没有任何泛型信息.那么,为什么第二种test
方法无法执行.对我来说第二种test
方法应该是(在运行时)以下面的形式public void test(List
不是吗?