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”呢?由于根据Wildcard我们已经指定,变量“ ln”可以接受“ NaturalNumber”的子类型,而“ EvenNumber”是子类型?
最佳答案
这是一个经典的问题。之所以出现,是因为是否允许:
List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(50));
ln.add(new EvenNumber(46));
EvenNumber even = le.get(0); // ClassCastException
le声明保证我们所有数字都必须是偶数。但是,如果允许您在此处添加NaturalNumber,则此保证无效。
关于java - 在Java中使用通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26534027/