java - 泛型:在集合中添加子类对象的问题

标签 java generics

所以我一直在阅读 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/

相关文章:

java - 使用反射的通用构建器模式类

java - 与泛型和类作斗争

java - Java泛型中有联合吗?

java - 在 JUnit 测试中是否可以检查方法 System.out.println()

java - 将 semver 版本字符串 (10.2.3) 转换为 long

java - 当并行测试返回 java.lang.NullPointerException 时调用另一个方法

Java 关闭 BufferedReader、Scanner 和 FileReader

java - '解码错误 : cvc-complex-type. 2.4.a : Invalid content was found starting with element 'XXXXX' . 预计 '{XXXXX}' 之一

c# - 对 IList 和 IEnumerable 使用泛型逆变

使用反射的 Java 通用枚举类