我试图理解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>
)