我试图理解Java泛型,但对有限的通配符感到困惑。我正在使用Guidelines for Wildcard Use中的层次结构,并添加了一个从EvenNumber继承的PositiveEvenNumber类。

    List<? super EvenNumber> xn = new ArrayList<NaturalNumber>();
    xn.add(new NaturalNumber(35));  // compile-time error
    xn.add(new EvenNumber(-70));
    xn.add(new PositiveEvenNumber(70));
    xn.add(new Object());  // compile-time error


为什么第一行会编译?在第二行上,NaturalNumber不是EvenNumber的父级,为什么不能添加它呢?

谢谢!

最佳答案

List<? super EvenNumber>是某些特定类型的列表,条件是该类型是EvenNumber的超类型。

因此,它可能是List<EvenNumber>,在这种情况下,您不能添加NaturalNumber

这也意味着您无法从列表中读取任何内容(Object除外),因为您不知道列表实际包含的类型。 (甚至可能是List<Object>

10-04 10:40