gpt4 book ai didi

java - Java 中泛型的策略模式

转载 作者:行者123 更新时间:2023-11-30 04:57:18 36 4
gpt4 key购买 nike

因此,我尝试创建一个具有通用函数的接口(interface),以便由子类覆盖,但我找不到方法来执行此操作。

我认为一段代码会更明确:

interface Agent<A extends Agent<A>> {
<W extends World> Iterable<Action<A,W>> percepts(W world);
<W extends World> void takeAction(Action<A,W> action, W world);
}

abstract class StrategistAgent<A extends StrategistAgent<A>> implements Agent<A> {
abstract public <W extends World> AgentStrategy<A,W> getStrategy();
abstract public <W extends World> void setStrategy(AgentStrategy<A,W> strategy);

@Override
<W extends World> Iterable<Action<A,W>> percepts(W world) {
return getStrategy().run(this, world);
}
}

interface AgentStrategy<A extends StrategistAgent<A>, W extends World> {
Iterable<Action<A,W>> run(A agent, W world);
void init(A agent, W world);
}

错误:AgentStrategy 类型中的方法 run(A, World) 不适用于参数 (StrategistAgent, W)

但我不能写:

StrategistAgent<A extends StrategistAgent<A>, W extends World>

编辑: 好的,我听从了 Mark Peters 的建议,删除了 setStrategy 方法。现在应该可以工作了..

最佳答案

是的,正如您现在可能已经发现的那样,问题在于没有任何内容表明发生错误的地方 thisA 的实例。这就是我在说泛型确实不是为这种自引用类型而设计时所表达的意思。

不过,您的设计中还存在其他问题。对于初学者来说,您在设置策略时接受的 W 可能与调用 percept 时获得的 W 完全不同。

那么你的前进方向是什么?好吧,我再次认为这取决于你的粘合代码,即创建代理和策略并将它们组合在一起的东西。

由于粘合代码很可能准确地知道它正在处理什么类型的代理和策略,因此您甚至可能不会从使 setStrategy 抽象中受益。 。一旦它不是抽象的,你就可以在每个子类中处理它。

实际上,您的子类只需要一个 protected 方法getStrategy。如果您强制所有子类提供该信息,您也可以强制它们返回 A:

abstract class StrategistAgent<A extends StrategistAgent<A>> implements Agent<A> {
protected abstract <W extends World> AgentStrategy<A,W> getStrategy();
protected abstract A getSelf();

@Override
public <W extends World> Iterable<Action<A,W>> percepts(W world) {
return this.<W>getStrategy().run(getSelf(), world);
}
}

所以这是一种解决方案。不过,我还得多考虑一下才能想到更优雅的。

关于java - Java 中泛型的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116173/

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