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

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


如何解决这个问题呢?

最佳答案

在不了解上下文的情况下很难提供建议。显然,您不能将IdGeneratorItemAction添加到List<RecursableAction<Recursable, AbstractContext>>,因为IdGeneratorItemActionRecursableAction<Item, IdGeneratorContext>并且它们不兼容(以与无法将List<String>分配给期望List<Object>)。但是同样,您不能在act(recursable)上调用RecursableAction<? 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());
}


但是如果没有的话,我认为如果没有在某处或其他地方的演出,您将无法实现您想要的目标。

09-27 15:28