gpt4 book ai didi

java - 在 Java 中使用通配符

转载 作者:行者123 更新时间:2023-11-30 06:16:54 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com