0

我希望我的框架在更改窗格时更改标题:

public void changePane(JPanel myNewPane){
    myGui.getContentPane().removeAll();
    myGui.getContentPane().add(myNewPane);
--->myGui.setTitle("Blah");
    myGui.pack();
}

除了我想更改"Blah"使用输入myNewPane作为映射中值的键的值,因此我有:

    private Map<? extends JPanel,String> PanelNames = new HashMap<? extends JPanel, String>();

除了,在 Eclipse 中,HashMap红色下划线带有错误“无法实例化类型 HashMap”

我尝试将窗格和字符串添加为键和值的地方,如下所示:

public void setPanelNames(Map<? extends JPanel,String> panelNames) {
    PanelNames.put(myTopManagerPane, "Main Manager Page");
    PanelNames.put(myPlayerManagerPane, "Player Manager Page");
    PanelNames.put(myGameManagerPane, "Game Manager Page");
}

这里put是红色下划线;我的错误是“类型 Map 中的 put(capture#2-of ? extends JPanel, String) 方法不适用于参数 (TopManagerPane, String)”

我究竟做错了什么?

4

1 回答 1

1

您无法创建HashMap使用泛型通配符。您需要指定具体类型。

? extends从您的定义中删除它应该可以工作:

private Map<JPanel,String> PanelNames = new HashMap<JPanel, String>();

public void setPanelNames(Map<JPanel,String> panelNames) {
  ...
}

请注意,这Map<? extends JPanel, String>意味着您接受任何使用类型JPanel或子类键的映射(例如MyPanel,如果它 extends JPanel)。但是,您在调用时创建的实际实例new HashMap<...>()需要知道是否允许任何JPanel或仅MyPanel允许实例,因此您需要在new HashMap<JPanel, String>()此处使用。然后地图知道键是JPanels并且不能更多地了解类型(在这种情况下无关紧要)。

在方法参数中, using? extends JPanel意味着您可以传递 aMap<JPanel, String>或 aMap<MyPanel, String>但编译器不会让您将面板添加到地图中,因为它不知道是否允许这样做 - 添加JPanels到 aMap<MyPanel, String>是非法的。

于 2012-07-17T15:52:45.877 回答