所以我試圖創建一個帶有泛型函數的接口,以便被子類覆蓋,但我找不到辦法來做到這一點。Java中的泛型策略模式
我認爲一段代碼會更明確:
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方法。應該現在正在工作..
刪除違規類型約束?看起來你在代理和StrategistAgent之間的類型約束中存在循環依賴,你需要以某種方式打破循環。 – millimoose
確定我縮小了問題:知覺是確定的,但它不能調用運行這應該是正確的......替換的Iterable>運行(A劑,W世界);在AgentStrategy中通過Iterable > run(StrategistAgent agent,W world);顯示錯誤:類型不匹配:無法從Iterable >轉換爲Iterable > –
Tug
爲什麼您的策略需要輸入到特定的代理子類中?如果你擴展了你實際想要完成的內容,這將是有幫助的,因爲這絕對不是泛型被設計爲如何使用的。 –