因此,我在这里阅读了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(或者根本不嵌套)。

10-06 09:52