我有一个这样的接口(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/