因此,我在这里阅读了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子类型的对象添加到集合c中。我不确定为什么这行不通,并且通读Oracle教程也没有启发我。
最佳答案
当您拥有? extends NaturalNumber
时,该参数可能是NaturalNumber
的其他一些子类,这些子类与EvenNumber
无关。例如,
Collection<? extends NaturalNumber> c = new ArrayList<OtherNaturalNumber>();
如果
OtherNaturalNumber
扩展NaturalNumber
,则有效。因此,您无法将
EvenNumber
实例添加到列表中。您可以使用以下声明:Collection<NaturalNumber> c = new ArrayList<>();
这将允许您添加任何
NaturalNumber
实例(包括EvenNumber
)。另一方面,您可能打算将这些嵌套的类设为
static
(或者根本不嵌套)。