在Java中使用通配符

Amu*_*aji 2 java generics wildcard

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

在Oracle文档中学习通配符时,我找到了上述代码.

根据源,变量"ln"不能接受任何"NaturalNumber",因为它是"EvenNumber"内容的列表.我尝试添加一个"EvenNumber"对象.这也是不被接受的.

似乎变量"ln"是文档中提到的只读对象.你们可以解释为什么这个对象是只读的吗?(我可以添加空值)如果我们不能添加"NaturalNumber",为什么我们不能添加"EvenNumber"呢?因为根据Wildcard我们已经指定,变量"ln"可以接受"NaturalNumber"的子类型,而"EvenNumber"是子类型吗?

Max*_*000 5

这是一个经典问题.它之所以成功,是因为如果它被允许:

    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
Run Code Online (Sandbox Code Playgroud)

我们保证le声明所有数字必须是偶数.但是如果允许你在那里添加一个NaturalNumber,那么这个保证会中断.