0

我正在尝试制作一个既可以实现又可以扩展的对象地图。他们正在扩展的类(JPanels)我无法控制。但是,我确实可以控制界面。

这是我尝试过的

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

然而,这是一个编译时错误。

我可以创建一个抽象类,然后让子类扩展它,但这似乎有点笨拙(或者是吗?)。

作为记录,我使用的是 Java 6

4

4 回答 4

3

然而,这是一个编译时错误。

是的。你不能给通配符多个界限。在可以使用通配符的位置以及可以使用类型参数的位置有一些限制。类型参数可以有多个界限,但不能有下限。另一方面,通配符可以有下界,但它们没有多个边界。

一种选择是将类型参数声明为类的一部分,并为其提供多个界限:

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

也可以看看:

参考:

于 2013-10-10T20:36:19.630 回答
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();
于 2013-10-10T20:34:59.583 回答
1

您应该按照您的建议创建自己的扩展 JPanel 并实现 MyInterface 的类,然后使用 Map<? extends MyNewSuperClass> myMap;

于 2013-10-10T20:35:11.893 回答
0

我从来不需要这样做,但正如你所建议的,你可以继续创建一个新的类或接口(根据你的需要)实现/扩展你需要的接口/类,然后在你的地图中使用它。

公共接口 IWhatIneed 实现 Jpanel、MyInterface{ ... }

接着:

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

我希望这会有所帮助

于 2013-10-10T20:41:02.410 回答