Java使用泛型

时间:2014-03-03 15:23:30

标签: java generics

我有一个像这样的界面:

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);上收到的错误不适用于这些参数。

编辑: 我已经更改了代码,现在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);

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

想象一下,你有两个子类:

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和一些A2