我正在阅读泛型中的类型擦除概念。在执行下面的代码时,我感到很困惑。
public class CollectionsWild {
void Test(Collection<?> t){
System.out.println("Collection");
}
void Test(List<Integer> t){
System.out.println("List");
}
public static void main(String[] args) {
CollectionsWild o = new CollectionsWild();
o.Test(new ArrayList<String>());
}
}
根据类型擦除概念,&#34; List<Integer> t
&#34;被转换为&#34;列表t&#34;在字节码中。那么为什么我的方法测试被调用哪个集合作为参数。它应该使用List作为参数调用方法
答案 0 :(得分:2)
这与擦除无关。重载分辨率在编译时完成。只有一个重载匹配ArrayList<String>
,这是所选择的重载。如果有多个匹配,则会选择最具体的匹配。
在使用相同类型擦除进行重载的情况下,在考虑重载解析之前,类型的定义不会编译。
答案 1 :(得分:2)
方法选择是编译时的事情。类型擦除后发生 。正如您在JLS§15.12.2中所看到的,通用类型参数被认为是:
在泛型方法(第8.4.4节)的情况下,确定方法是否适用,需要分析类型参数。