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