所以我一直在阅读 Oracle 提供的泛型教程:http://docs.oracle.com/javase/tutorial/java/generics/
而且我尝试运行自己的示例以确保我了解如何使用泛型。我有以下代码:
import java.util.*;
public class Generics {
class NaturalNumber {
private int i;
public NaturalNumber(int i) { this.i = i; }
}
class EvenNumber extends NaturalNumber {
public EvenNumber(int i) {
super(i);
}
}
public static void main(String[] args) {
Collection<? extends NaturalNumber> c = new ArrayList<>();
c.add(new EvenNumber(2)); //this line produces a compile time error
}
}
我的目标是能够将任何属于 NaturalNumber 子类型的对象添加到 Collection c 中。我不确定为什么这不起作用,通读 Oracle 的教程也没有启发我。
最佳答案
当你有? extends NaturalNumber
,参数可以是 NaturalNumber
的某个 other 子类,与 EvenNumber
没有任何关系。例如,
Collection<? extends NaturalNumber> c = new ArrayList<OtherNaturalNumber>();
如果 OtherNaturalNumber
扩展 NaturalNumber
则有效。
因此,您无法将 EvenNumber
实例添加到列表中。你可以只使用这个声明:
Collection<NaturalNumber> c = new ArrayList<>();
这将允许您添加任何 NaturalNumber
实例(包括 EvenNumber
)。
另一方面,您可能打算使这些嵌套类静态
(或者根本不嵌套它们)。
关于java - 泛型:在集合中添加子类对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347991/