如何向此通用列表添加元素?

时间:2012-11-14 14:45:09

标签: java generics

我有一个声明如下的列表,我打算在其中添加对象。

List<RecursableAction<Recursable, AbstractContext>> actions = new ArrayList<>();

我有IdGeneratorItemAction,如下所示:

public class IdGeneratorItemAction implements RecursableAction<Item, IdGeneratorContext> {
    private IdGeneratorContext context;

    @Override
    public void act(Item recursable) {
    }
}

界面RecursableAction如下所示:

public interface RecursableAction<R extends Recursable, C extends AbstractContext> {
    void act(R recursable);
}

我尝试创建IdGeneratorItemAction的实例,并将其添加到actions列表中,如下所示:

RecursableAction<Recursable, AbstractContext> action = new IdGeneratorItemAction();
actions.add(action);

当我尝试这样做时,我收到以下编译错误:

RecursableAction<Recursable, AbstractContext> action = new IdGeneratorItemAction();
                                                       ^
Type mismatch: cannot convert from IdGeneratorItemAction to RecursableAction<Recursable,AbstractContext>

我尝试将actions的延期更改为

List<RecursableAction<? extends Recursable, ? extends AbstractContext>> actions = new ArrayList<>();

但是当我这样做时,我再也无法迭代actions

for (RecursableAction<? extends Recursable, ? extends AbstractContext> action : actions) {
    action.act(recursable);
    ^
    The method act(capture#1-of ? extends Recursable) in the type RecursableAction<capture#1-of ? extends Recursable,capture#2-of ? extends AbstractContext> is not applicable for the arguments (Recursable)
}

如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

在不了解背景的情况下,很难提出建议。显然,您无法将IdGeneratorItemAction添加到List<RecursableAction<Recursable, AbstractContext>>,因为IdGeneratorItemActionRecursableAction<Item, IdGeneratorContext>且这些不兼容(就像您无法分配{{ {1}}到期望List<String>的变量。但同样地,您无法在List<Object>上致电act(recursable),因为您不知道它所期望的RecursableAction<? extends Recursable, ? extends AbstractContext>类型。

如果您所处的环境中您知道所有操作都是兼容的,那么您就可以了,例如

Recursable

但如果没有,那么我不认为你可以在某个地方或其他地方没有演员的情况下达到你想要的效果。