【问题标题】:Type erasure in generics confusion泛型混淆中的类型擦除
【发布时间】:2017-04-18 15:45:35
【问题描述】:

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

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>());
    }

}

根据类型擦除概念,“List&lt;Integer&gt; t”被转换为字节码中的“List t”。那么为什么我的方法测试被称为以 Collection 作为参数。它应该调用以List为参数的方法

【问题讨论】:

  • 谢谢,但您提供的链接与我的要求无关..

标签: java generics collections overloading


【解决方案1】:

这与擦除无关。重载解决是在编译时完成的。只有一个重载与ArrayList&lt;String&gt; 匹配,并且是选择的那个。如果有多个匹配项,则会选择最具体的匹配项。

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

【讨论】:

    【解决方案2】:

    方法选择是编译时的事情。类型擦除发生在之后。正如您在JLS§15.12.2 中看到的那样,考虑了泛型类型参数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多