我正在尝试理解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的父母,为什么不能添加它?
谢谢!
答案 0 :(得分:2)
List<? super EvenNumber>
是某些特定类型的列表,前提是该类型是EvenNumber
的超类型。
因此,它可能是List<EvenNumber>
,在这种情况下,您无法添加NaturalNumber
。
这也意味着您无法从列表中读取任何内容(Object
除外),因为您不知道列表实际包含的类型。 (它甚至可以是List<Object>
)