2

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

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)
}

如何解决这个问题呢?

4

1 回答 1

6

在不了解上下文的情况下,很难给出建议。显然,您不能将 a 添加IdGeneratorItemAction到 aList<RecursableAction<Recursable, AbstractContext>>因为IdGeneratorItemAction是 aRecursableAction<Item, IdGeneratorContext>并且它们不兼容(就像您不能将 a 分配给List<String>期望 a 的变量一样List<Object>)。但同样你不能调用act(recursable)aRecursableAction<? extends Recursable, ? extends AbstractContext>因为你不知道Recursable它期望什么样的。

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

public static <R extends Recursable> void doStuff(
      List<? extends RecursableAction<R, ?>> actions, R recursable) {
  for(RecursableAction<R, ?> action : actions) {
    action.act(recursable);
  }
}

public static void main(String[] args) {
  List<RecursableAction<Item, IdGeneratorContext>> actions = new ArrayList<>();
  actions.add(new IdGeneratorItemAction());
  doStuff(actions, new Item());
}

但如果不是,那么我认为如果没有某个地方或其他地方的演员,你就无法实现你想要的。

于 2012-11-14T15:43:57.993 回答