gpt4 book ai didi

java - 如何向这个通用列表添加元素?

转载 作者:行者123 更新时间:2023-11-30 05:50:56 25 4
gpt4 key购买 nike

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

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

我有一个如下所示的 IdGeneratorItemAction:

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

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

接口(interface) 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)
}

如何解决这个问题?

最佳答案

在不了解上下文的情况下很难给出建议。显然你不能添加 IdGeneratorItemActionList<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());
}

但如果没有,那么我不认为你可以在没有某个地方或其他地方的转换的情况下实现你想要的。

关于java - 如何向这个通用列表添加元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com