6

我有一个界面A:

interface A {
}

然后我有一个B类:

class B implements A {
}

然后我有一个使用 A 列表的方法:

void process(ArrayList<A> myList) {
}

我想传递一个 B 列表:

ArrayList<B> items = new ArrayList<B>();
items.add(new B());
process(items);

但随后出现类型不匹配的错误。我明白为什么。ArrayList本身是一种类型,它没有从 转换为ArrayList<B>的功能ArrayList<A>。是否有一种快速且资源明智的轻量级方法来形成一个适合传递给我的process方法的新数组?

4

2 回答 2

10

我认为最简单的解决方案是将其中一种方法更改为:

void process(ArrayList<? extends A> myList) {
}

但是,请注意,使用此解决方案,整个列表需要属于同一类型。也就是说,如果您有一个C也可以实现的类,A则不能混合数组中的项目,使其部分为 type B,部分为 type C

此外,正如下面评论中所指出的,您将无法在此方法中将对象添加到列表中。

于 2012-09-18T20:35:17.450 回答
4

另一种选择是只创建一个 ArrayListA而不是B

ArrayList<A> items = new ArrayList<A>();
items.add(new B());
process(items);

在声明的列表中添加实现接口的类(例如 B)是完全可以接受的。

顺便说一句:我会List在实例化列表时使用并且只使用 ArrayList 。还包括西蒙的回答,这可能成为

void process(List<? extends A> myList) {
}

List<A> items = new ArrayList<A>();
items.add(new B());
process(items);
于 2012-09-18T20:42:19.570 回答