2013-06-26 64 views
1

我需要接受一個Map,它可以是TypeA或TypeB,如下所示。多種類的上界 - Java泛型

Map<Animal, List<TypeA/TypeB>> 

我該如何聲明?我無法爲上限指定兩個類。

Map<Animal, List<? extends Object>> OR Map<Animal, List<Object>> 

太寬。我想將其限制爲TypeA或TypeB

有沒有更好的方法?

不能用接口包裝TypeA和TypeB。

編輯: 從答案,我明白,這是不可能的自定義類型。 後續問題是,如果我只使用<? extends Object>,我該如何檢查類型?是TypeA或TypeB。我應該使用instanceof嗎?代碼示例?

+1

如果'TypeA'和'TypeB'是非協方差類型,那麼除了'?'之外沒有任何選項。擴展對象「。如果你不想要這麼寬泛的類型,那麼你必須在這兩種類型之間建立某種關係。 –

回答

3

明顯的解決方案是引入超類型TypeATypeB,其中包含您需要的行爲。

另一種方法是使用適配器。引用來自ye olde Gang of Four的書:

將類的接口轉換爲客戶端期望的另一個接口。適配器讓班級一起工作,否則因爲不兼容的界面而無法工作。

所以在這裏,我們將介紹一個適配器類型(只有比這更好的名稱)。

interface Ab { 
    void someOp(); 
} 

然後我們可以包裝現有的對象。

public static Ab asAb(final TypeA obj) { 
    return new Ab() { 
     public void someOp() { 
      obj.someOp(); 
     } 
    }; 
} 

地圖可以使用適配器類型作爲值。

Map<Animal, List<Ab>> 

當我在現有的代碼中遇到這個問題時,這是因爲地圖實際上包含兩個不相交的地圖。簡單的解決方案是使用兩張地圖。

+0

+1適配器,因爲他明確表示他不能提取通用接口 – darijan

+0

我無法觸摸TypeA或TypeB。適配器會相關嗎? –

+0

@KevinRave Yup。增加了更多的解釋。 –