我正在尝试制作一个既可以实现又可以扩展的对象地图。他们正在扩展的类(JPanels)我无法控制。但是,我确实可以控制界面。
这是我尝试过的
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
然而,这是一个编译时错误。
我可以创建一个抽象类,然后让子类扩展它,但这似乎有点笨拙(或者是吗?)。
作为记录,我使用的是 Java 6
然而,这是一个编译时错误。
是的。你不能给通配符多个界限。在可以使用通配符的位置以及可以使用类型参数的位置有一些限制。类型参数可以有多个界限,但不能有下限。另一方面,通配符可以有下界,但它们没有多个边界。
一种选择是将类型参数声明为类的一部分,并为其提供多个界限:
class MyClass<T extends JPanel & MyInterface> {
Map<MyEnum, T> myMap; // This would work fine now
}
也可以看看:
参考:
我可以创建一个抽象类,然后让子类扩展它,但这似乎有点笨拙(或者是吗?)。
一点也不:这应该工作得很好。
另一种方法是添加一个接口,将JPanel
感兴趣的方法组合到使用的方法中myMap
,并像这样使用它:
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;
我从来不需要这样做,但正如你所建议的,你可以继续创建一个新的类或接口(根据你的需要)实现/扩展你需要的接口/类,然后在你的地图中使用它。
公共接口 IWhatIneed 实现 Jpanel、MyInterface{ ... }
接着:
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
我希望这会有所帮助