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/

10-09 04:51