我有一个这样的界面A:
public interface A{
void myFirstMethod();
void mySecondMethod();
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个课:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我以前没有使用泛型(只有类似的东西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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,它不会编译.
//A1 implements A
List<A1> list = new ArrayList<A1>();
MyClass(list);
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个问题?
想象一下,你有两个子类:
class A1 implements A {...}
class A2 implements A {...}
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
List<? extends A> elements = new ArrayList<A1>(); // a list of A1
Run Code Online (Sandbox Code Playgroud)
但是这不应该编译:
elements.add(new A2()); //oops: an A2 is not an A1
Run Code Online (Sandbox Code Playgroud)
因此,除了null
a之外你不能添加任何东西,List<? extends A>
因为你不知道它是什么实际的泛型类型.换句话说,? extends A
意味着A
(或A
自身)的特定但未知的子类型.
在你的情况下,List<A>
你可能会做你期望的 - 你可以添加一些A1
s和一些A2
s.
归档时间: |
|
查看次数: |
99 次 |
最近记录: |