我有一个像这样的界面:
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);
我该如何解决这个问题?
答案 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
。