在泛型混淆中输入擦除

时间:2017-04-18 15:45:35

标签: java generics collections overloading

我正在阅读泛型中的类型擦除概念。在执行下面的代码时,我感到很困惑。

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作为参数调用方法

2 个答案:

答案 0 :(得分:2)

这与擦除无关。重载分辨率在编译时完成。只有一个重载匹配ArrayList<String>,这是所选择的重载。如果有多个匹配,则会选择最具体的匹配。

在使用相同类型擦除进行重载的情况下,在考虑重载解析之前,类型的定义不会编译。

答案 1 :(得分:2)

方法选择是编译时的事情。类型擦除后发生 。正如您在JLS§15.12.2中所看到的,通用类型参数被认为是

  

在泛型方法(第8.4.4节)的情况下,确定方法是否适用,需要分析类型参数。