2015-09-13 47 views
3

因此,我無法圍繞正確的設計對此進行包裝。如何將泛型與多個耦合對象一起使用?

我的應用程序有兩個控制狀態的關鍵對象,需要相互交互: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楊的解決方案是相當不錯的

+0

這對我來說似乎還行,似乎沒有其他辦法可以做到這一點。是的,泛型語法很糟糕! –

+0

我已更新我的示例代碼以包含doSomething()的實現。 –

回答

1

我想聲明這些2類時,你可能只是引用泛型類型ITEM_TYPE。

我能夠編譯下面的代碼沒有錯誤。

public abstract class ItemList<ITEM_TYPE> { 
    public abstract ItemState<ITEM_TYPE> getState(); 

    public abstract ITEM_TYPE getItem(); 
} 

public abstract class ItemState<ITEM_TYPE> { 
    public abstract ItemList<ITEM_TYPE> getItemList(); 

    public void doSomething() { 
     ITEM_TYPE item = getItemList().getItem(); 
     System.out.println(item); 
    } 
} 

public class StringList extends ItemList<String> { 
    @Override 
    public StringState getState() { 
     return new StringState(); 
    } 

    @Override 
    public String getItem() { 
     return ""; 
    } 
} 

public class StringState extends ItemState<String> { 
    @Override 
    public StringList getItemList() { 
     return new StringList(); 
    } 
} 
+0

問題是,在抽象基類中工作時,無法判斷耦合對象是否具有相同類型。 – sicklybeans

+0

能否請您詳細說明一下例子? –

+0

正如您在我的代碼中看到的那樣,在抽象類ItemList 中,使用ItemState 確保耦合對象具有相同類型,但在抽象類ItemState 中,出於同樣的目的使用ItemList 。 –

相關問題