Java通用通配符以列表为界

时间:2014-11-06 14:38:11

标签: java generics

我正在尝试理解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的父母,为什么不能添加它?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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