我正在試圖製作既實施又擴展的對象的地圖。他們正在擴展的類(JPanels)我無法控制。但是,我確實可以控制界面。Java:擴展和實現對象的地圖
這是我已經試過
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
然而,這是一個編譯時錯誤。
我可以做一個抽象類,然後讓子類擴展它,但這似乎有點沉重(或者是它?)。
爲了記錄在案,我使用的Java 6
我正在試圖製作既實施又擴展的對象的地圖。他們正在擴展的類(JPanels)我無法控制。但是,我確實可以控制界面。Java:擴展和實現對象的地圖
這是我已經試過
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
然而,這是一個編譯時錯誤。
我可以做一個抽象類,然後讓子類擴展它,但這似乎有點沉重(或者是它?)。
爲了記錄在案,我使用的Java 6
但是,這是編譯時錯誤。
是的。你不能給通配符多個界限。對可以使用通配符的位置以及可以使用類型參數的位置有一些限制。類型參數可以有多個邊界,但它們不能有下限。另一方面,通配符可以有下限,但它們沒有多個邊界。
一種選擇是聲明爲類的一部分類型參數,並給它多重限制:
class MyClass<T extends JPanel & MyInterface> {
Map<MyEnum, T> myMap; // This would work fine now
}
參見:
參考文獻:
我可以做一個抽象類,然後讓子類擴展它,但似乎有點重手(是嗎?)。
一點都沒有:這應該工作得很好。
另一種方法是添加結合了感興趣的你的方法是使用myMap
JPanel
方法的接口,並使用它像這樣:
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();
你應該創建自己的類,它擴展了JPanel並你也建議使用MyInterface,然後使用Map<? extends MyNewSuperClass> myMap;
我從來沒有這樣做,但如你所說,你可以繼續前進,創造一個新的類或接口(基於根據你的需要)實現/擴展你需要的接口/類,然後在你的Map中使用它。
公用接口IWhatIneed實現的JPanel,MyInterface的{ ... }
然後:
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
我希望這將有助於