我正在尝试制作实现和扩展的对象的地图。他们正在扩展的课程(JPanels)我无法控制。但是,我确实可以控制界面。
这就是我试过的
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
然而,这是一个编译时错误。
我可以创建一个抽象类,然后让子类扩展它,但这看起来有点沉重(或者是它?)。
为了记录,我正在使用Java 6
答案 0 :(得分:3)
然而,这是一个编译时错误。
是。您不能给通配符提供多个边界。您可以在哪里使用通配符以及可以使用类型参数的位置存在一些限制。类型参数可以有多个边界,但它们不能有下限。另一方面,通配符可以有下限,但它们没有多个边界。
一个选项是将type参数声明为类的一部分,并为其赋予多个边界:
class MyClass<T extends JPanel & MyInterface> {
Map<MyEnum, T> myMap; // This would work fine now
}
另见:
<强>参考文献:强>
答案 1 :(得分:1)
我可以创建一个抽象类,然后让子类扩展它,但这看起来有点沉重(或者是它?)。
完全没有:这应该可以正常工作。
另一种方法是添加一个界面,该界面将感兴趣的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();
答案 2 :(得分:1)
您应该创建自己的类来扩展JPanel并按照您的建议实现MyInterface,然后使用Map<? extends MyNewSuperClass> myMap;
答案 3 :(得分:0)
我从来不必这样做,但正如您所建议的那样,您可以继续创建一个新类或接口(根据您的需要)实现/扩展您需要的接口/类,然后在Map中使用它。
公共接口IWhatIneed实现了Jpanel,MyInterface { ... }
然后:
Map<MyEnum, ? extends JPanel & MyInterface> myMap;
我希望这会有所帮助