【发布时间】:2014-10-23 17:38:22
【问题描述】:
import java.util.ArrayList;
import java.util.List;
public class WildCardNumber {
public static void main(String[] args) {
List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(50));// * Compile time error
ln.add(new EvenNumber(46)); // ** Compile time error
}
}
class NaturalNumber {
private int n;
public NaturalNumber(int n) {
this.n = n;
}
}
class EvenNumber extends NaturalNumber {
public EvenNumber(int n) {
super(n);
}
}
在 Oracle 文档中研究通配符时,我发现了上述代码。
根据来源,变量“ln”不能接受任何“NaturalNumber”,因为它是“EvenNumber”内容的列表。我尝试向它添加一个“EvenNumber”对象。这也不被接受。
变量“ln”似乎是文档中提到的只读对象。你们能解释一下为什么这个对象是只读的吗?(我可以添加空值)如果我们不能添加“NaturalNumber”,为什么我们也不能添加“EvenNumber”?既然根据通配符我们已经指定,变量“ln”可以接受“NaturalNumber”的子类型,而“EvenNumber”是子类型?
【问题讨论】: