【问题标题】:Why second example compiles sucessfuly [duplicate]为什么第二个示例编译成功[重复]
【发布时间】:2016-10-14 22:42:43
【问题描述】:
import java.util.*;    

class Test
{
    public static class Base
    {           
    }

    public static class Derived1
        extends Base
    {               
    }

    public static class Derived2
        extends Base
    {               
    }

    public static void main (String[] args)
    {
        //Example1.
        List<? extends Base> e = new ArrayList<Base>();
        e.add(new Derived1()); //this won't compile

        //Example2.
        List<? super Base> b = new ArrayList<Base>();
        b.add(new Derived1()); //this compiles
    }
}

【问题讨论】:

    标签: java generics


    【解决方案1】:

    List&lt;? super Base&gt; b 可以指定为List&lt;Base&gt;List&lt;Object&gt;。可以将Derived1 实例添加到两者,因此b.add(new Derived1()) 语句通过编译。

    另一方面,List&lt;? extends Base&gt; e 可能被分配了 List&lt;Derived2&gt;,因此编译器不允许向其添加 Derived1 实例。

    【讨论】:

      【解决方案2】:

      What is PECS (Producer Extends Consumer Super)?

      如果您要向List&lt;T&gt; 添加内容,那么列表就是您添加的内容的消费者。因此,列表元素的类型T 必须与您尝试添加的内容相同或超类型

      【讨论】:

      • 泰。对于这个答案。:)
      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多