我有一个声明如下的列表,打算在其中添加对象。
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>>
,因为IdGeneratorItemAction
是RecursableAction<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());
}
但是如果没有的话,我认为如果没有在某处或其他地方的演出,您将无法实现您想要的目标。