因此,我無法圍繞正確的設計對此進行包裝。如何將泛型與多個耦合對象一起使用?
我的應用程序有兩個控制狀態的關鍵對象,需要相互交互:ItemList,ItemState。這些依賴於通用的ITEM_TYPE,因此它們可以在不同的上下文中運行。它們也是抽象的,以允許ITEM_TYPE相關的行爲。
這兩個部分都需要知道泛型,而且,因爲他們彼此交談,他們需要知道另一個泛型。 (一個ItemList < String>實例需要知道它的ItemState字段是一個ItemState < String>,反之亦然)。
我目前的解決方案工作,但它似乎很糟糕。一定有更好的方法。這是我現在在做什麼:
public abstract class ItemState<
ITEM_TYPE,
STATE_TYPE extends ItemState<ITEM_TYPE, STATE_TYPE, LIST_TYPE>,
LIST_TYPE extends ItemList<ITEM_TYPE, STATE_TYPE, LIST_TYPE>> {
}
public abstract class ItemList<
ITEM_TYPE,
STATE_TYPE extends ItemState<ITEM_TYPE, STATE_TYPE, LIST_TYPE>,
LIST_TYPE extends ItemList<ITEM_TYPE, STATE_TYPE, LIST_TYPE>> {
}
然後實現類可能看起來像:
class StringState extends ItemState<String, StringState, StringList> {
}
class StringList extends ItemList<String, StringState, StringList> {
}
注意,對於ITEMSTATE,爲state_type是一個參考回到實現類,同樣的ITEMLIST/LIST_TYPE。
真的,如果我只是將ItemState作爲ItemList的內部類,將會得到解決,因爲會有隱式綁定,它們可以共享通用聲明,但是這兩個類都非常大且獨立,我不想做這個。
有什麼建議嗎?
編輯:作爲一個反例評論:
public abstract class ItemState<ITEM_TYPE> {
public abstract ItemList getItemList();
public void doSomething() {
// This should not compile because abstract super class has
// no idea what the generic type of getItemList() is
ITEM_TYPE item = this.getItemList.getItem();
}
}
編輯2:我覺得我能想到的最好的解決辦法只是爲了讓ITEMLIST/ITEMSTATE繼承的一種方式或其他使他們可以作爲同一班。我不喜歡這個解決方案,因爲它覆蓋了關注點的分離,但它使泛型更易於管理。
旁註:我的實際應用有4個交織類的問題,我只是爲了簡單而使用了2。實際上,泛型非常糟糕,它們難以理解並且難以重構(每個類只有大約4條完整的泛型聲明)。現在我做了這4類成垂直的繼承層次
JM楊的解決方案是相當不錯的
這對我來說似乎還行,似乎沒有其他辦法可以做到這一點。是的,泛型語法很糟糕! –
我已更新我的示例代碼以包含doSomething()的實現。 –