2013-10-10 26 views
0

我正在試圖製作既實施又擴展的對象的地圖。他們正在擴展的類(JPanels)我無法控制。但是,我確實可以控制界面。Java:擴展和實現對象的地圖

這是我已經試過

Map<MyEnum, ? extends JPanel & MyInterface> myMap; 

然而,這是一個編譯時錯誤。

我可以做一個抽象類,然後讓子類擴展它,但這似乎有點沉重(或者是它?)。

爲了記錄在案,我使用的Java 6

回答

3

但是,這是編譯時錯誤。

是的。你不能給通配符多個界限。對可以使用通配符的位置以及可以使用類型參數的位置有一些限制。類型參數可以有多個邊界,但它們不能有下限。另一方面,通配符可以有下限,但它們沒有多個邊界。

一種選擇是聲明爲類的一部分類型參數,並給它多重限制:

class MyClass<T extends JPanel & MyInterface> { 
    Map<MyEnum, T> myMap; // This would work fine now 
} 

參見:

參考文獻:

1

我可以做一個抽象類,然後讓子類擴展它,但似乎有點重手(是嗎?)。

一點都沒有:這應該工作得很好。

另一種方法是添加結合了感興趣的你的方法是使用myMapJPanel方法的接口,並使用它像這樣:

interface MyPanelInterface extends MyInterface { 
    void updateUI(); 
} 
... 
class MySpecialPanel extends JPanel implements MyPanelInterface { 
    ... 
    // Implementation for updateUI() comes from JPanel 
    // You are responsible for implementing the remaining methods. 
} 
... 
Map<MyEnum, ? extends MyPanelInterface> myMap; 
... 
myMap.get(MyEnum.FIRST).updateUI(); 
1

你應該創建自己的類,它擴展了JPanel並你也建議使用MyInterface,然後使用Map<? extends MyNewSuperClass> myMap;

0

我從來沒有這樣做,但如你所說,你可以繼續前進,創造一個新的類或接口(基於根據你的需要)實現/擴展你需要的接口/類,然後在你的Map中使用它。

公用接口IWhatIneed實現的JPanel,MyInterface的{ ... }

然後:

Map<MyEnum, ? extends JPanel & MyInterface> myMap; 

我希望這將有助於