2

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

public interface A {  }

public interface B extends A {}


public class C {
void test() {
    ArrayList<A> foo = new ArrayList<B>();
    }
}

但是编译给了我以下错误

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

4

3 回答 3

7

乍一看似乎违反直觉,但即使 classB是 的子类A, aList<B>也不是 的子类List<A>我在之前对类似帖子的回答中给出了更详细的解释和示例。另请参阅此其他答案以获取Effective Java 2nd Edition中相应项目的链接。

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

List<? extends A> foo = new ArrayList<B>();
于 2011-04-10T13:52:17.627 回答
4
ArrayList<? extends A> foo = new ArrayList<B>();

A 的列表与 B 的列表不同,因为您无法保证列表中内容的一致性。

即,如果可能的话,您可以在仅实例化为包含 B 元素的列表中插入 A 类型的项目。

当然,上述声明会阻止您将任何元素写入列表。这是一个只读声明。

将变量声明为接口而不是实现也是一个很好的 OOP 原则:

List<? extends A> foo = new ArrayList<B>();
于 2011-04-10T13:53:33.577 回答
1

只是在上面发布相同的内容:) 好吧.. 答案是一样的,这应该对你有用。

ArrayList<? extends A> foo = new ArrayList<B>();
于 2011-04-10T14:00:54.400 回答