我正在尝试理解 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
的父类(super class)型.
因此,它可能是 List<EvenNumber>
,在这种情况下您无法添加 NaturalNumber
.
这也意味着您无法从列表中读取任何内容(Object
除外),因为您不知道列表实际包含什么类型。 (甚至可能是 List<Object>
)
关于Java 通用通配符限制在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782113/