Java 使用泛型

标签 java generics

我有一个这样的接口(interface) A:

public interface A{
    void myFirstMethod();
    void mySecondMethod();
}

然后我有这门课:

public class MyClass{
    private List<? extends A> elements;

    public MyClass(){
        A obj = new A(){
            @Override
            public void myFirstMethod(){
              //SOME CODE
            }
            @Override
            public void mySecondMethod(){
              //SOME CODE
            }
        };
        elements.add(obj);
    }
}

我之前没有使用过泛型(只有像 List<String>... 这样的东西)所以我不明白为什么这段代码不能编译。更准确地说,我在 elements.add(obj); 行出错add 方法不适用于这些参数。

编辑: 我更改了代码,现在 elements.add(obj) 可以正常编译,但我还有另一个问题。

public class MyClass{
    private List<A> elements;

    public MyClass(List<A> elements){
        this.elements = elements;
        elements.add(obj);
    }
}

当我尝试这样做时,它无法编译。

//A1 implements A
List<A1> list = new ArrayList<A1>();
MyClass(list);

我该如何解决这个问题?

最佳答案

假设您有两个子类:

class A1 implements A {...}
class A2 implements A {...}

然后你可以写:

List<? extends A> elements = new ArrayList<A1>(); // a list of A1

但是这不应该编译:

elements.add(new A2()); //oops: an A2 is not an A1

因此,您只能添加 null 以外的任何内容到 List<? extends A>因为你不知道它是什么实际的通用类型。换句话说,? extends A表示 A 的特定但未知的子类型(或 A 本身)。

在你的例子中,一个 List<A>可能会做你期望的 - 你可以添加一些 A1 s 和一些 A2就这样吧。

关于Java 使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150580/

相关文章:

java - 对多个函数执行相同的操作

java - 有没有命令行javadoc查询工具?

java - 如何更改 Jenkins 中的 JAR 构建路径?

Java map 要设置吗?有没有办法实现预先存在的java库以允许包含Sets作为值的Map?

java - 比较通用列表中的元素

java - 为什么这个泛型引用不能指向Java中这个类似的扩展类?

java - 依赖冲突并且找不到 jar 来解决该问题

java泛型边界类型

java - 如何使用包含完全相同类型的参数但使用其他类型参数化的参数列表的方法重载方法

java - JTabbedPane JLabel, JTextField