关于java:为什么第二个例子编译成功

Why second example compiles sucessfuly

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
    }
}


List b可以分配为ListListDerived1实例可以添加到这两个实例中,因此b.add(new Derived1())语句通过编译。

另一方面,List e可以被分配一个List,因此编译器不允许向它添加Derived1实例。


看什么是PECS(生产者扩展消费者超级)?.

如果您要向List中添加某些内容,那么列表就是您要添加的内容的消费者。因此,列表元素的类型T必须与您试图添加的内容或父类型相同。