泛型类型的Java容器

泛型类型的Java容器,java,generics,Java,Generics,我正在准备考试,教授给我们的一个代码对我来说很模糊: public class Z { static java.util.LinkedList<? extends Object> a = new java.util.LinkedList<String>(); public static void main(String[] args) { a.add(null); // 1 a.add(new O

我正在准备考试,教授给我们的一个代码对我来说很模糊:

public class Z {

    static java.util.LinkedList<? extends Object> a =
            new java.util.LinkedList<String>();

    public static void main(String[] args) {
        a.add(null); // 1
        a.add(new Object()); // 2
        a.add("new Object()"); // 3
        System.out.println(a); // 4
    }
}

谁能给我解释一下这些错误吗?我很确定应该可以将字符串对象添加到此列表中。

PECS-生产者扩展,消费者超级-这是Bloch为解决上述问题而提出的助记符

换句话说,如果使用
扩展
,则只能从集合中生成元素。如果希望它使用元素,请使用
super


其要点是强制执行编译时安全性。如果您的集合是用
定义的?扩展SomeBaseClass,这意味着“它可以包含基类的单个子类的实例”。在您的例子中,您正在定义
新的LinkedList()
,但您试图添加一个
对象
——这是不允许的,编译器会捕获它。

什么
LinkedList,通过have
LinkedList调用
a.add()
,java实际上只知道您调用了add on
java.util.LinkedList,它在
a.add(“newobject()”)行显示编译器错误也是。感谢您的回答Bozho,但它没有解释为什么在“add”(“new Object()”);行中显示编译错误,即使它添加了一个字符串object@Maciej无法向该集合添加任何内容。因为它只被定义为产生元素。这是不是意味着“和女士”?;)谢谢您的回答:)所以,我理解,当您使用通配符
时,通过声明
LinkedListYes。如果您想具体一点,请将列表绑定到一个类型。
a = new java.util.LinkedList<Object>();  // valid
a = new java.util.LinkedList<Integer>();  // valid
a = new java.util.LinkedList<java.util.zip.Checksum>();  // valid
static java.util.LinkedList<? extends Number> b = new java.util.LinkedList<Integer>();
b.add(new Float(10.0f)); // fails
b.add(new Integer(10)); // fails
static java.util.LinkedList<? super Number> c = new java.util.LinkedList<Number>(); // valid
static java.util.LinkedList<? super Number> c = new java.util.LinkedList<Object>(); // valid
static java.util.LinkedList<? super Number> c = new java.util.LinkedList<Integer>(); // fails
public static void main(String[] args) {
       a.add(null); // 1
        ((List<Object>)a).add(new Object()); // 2
        ((List<Object>)a).add("new Object()"); // 3
        System.out.println(a); // 4
}