2011-11-14 77 views
1

所以我試圖創建一個帶有泛型函數的接口,以便被子類覆蓋,但我找不到辦法來做到這一點。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方法。應該現在正在工作..

+1

刪除違規類型約束?看起來你在代理和StrategistAgent之間的類型約束中存在循環依賴,你需要以某種方式打破循環。 – millimoose

+0

確定我縮小了問題:知覺是確定的,但它不能調用運行這應該是正確的......替換的Iterable >運行(A劑,W世界);在AgentStrategy中通過Iterable > run(StrategistAgent agent,W world);顯示錯誤:類型不匹配:無法從Iterable >轉換爲Iterable > – Tug

+0

爲什麼您的策略需要輸入到特定的代理子類中?如果你擴展了你實際想要完成的內容,這將是有幫助的,因爲這絕對不是泛型被設計爲如何使用的。 –

回答

2

正確的問題,因爲你現在可能已經想通了,沒有什麼說你的錯誤發生在哪裏,thisA的一個實例。這就是當我說泛型真的不適合這種自引用類型的時候。

你已經在你的設計中有其他問題也一樣,雖然。因爲當你設定的策略可能是一個完全不同的類比W,你得到的時候percept叫您接受首發的W

那麼,什麼是你前進的方向?那麼,我認爲這取決於你的膠水代碼,這是創造代理和策略的東西,並將它們放在一起。

自認爲膠水代碼是在所有的可能性要確切地知道什麼類型的代理和策略,它在處理的,你可能作出setStrategy抽象甚至沒有好處。一旦它不是抽象的,你可以在每個子類中處理它。

真的你從你的子類需要的是一個受保護的方法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); 
    } 
} 

因此,這是一個解決方案。我不得不多想一些,想想更優雅的那個。

+2

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms。 html#FAQ206 – Tug

+0

啊,很好找!很高興知道我的術語並不完全不在基地。 –