带参数化列表的Java继承

pla*_*hos 2 java inheritance parameterized

我有一个奇怪的继承问题,我不明白为什么它不应该工作:

public interface A {  }

public interface B extends A {}


public class C {
void test() {
    ArrayList<A> foo = new ArrayList<B>();
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译给我以下错误

Type mismatch: cannot convert from ArrayList<B> to ArrayList<A> C.java /bla/src/de/plai/test line 8 Java Problem

Pét*_*rök 7

一开始看起来有点违反直觉,但即使class B是其子类A,a List<B>也不是它的子类List<A>.我在之前对类似帖子的回答中给出了更详细的解释和示例.另请参阅另一个答案,以获取Effective Java 2nd Edition中相应项目的链接.

解决此问题的方法是使用通配符.因此,您应该将列表声明为

List<? extends A> foo = new ArrayList<B>();
Run Code Online (Sandbox Code Playgroud)