为什么HashMap#返回一个对象而不是一个字符串?

时间:2014-06-10 19:29:28

标签: java map

此代码打印IS STRING,表示该映射值为String。

if(mymap.get("name") instanceof String ) {
    System.out.print("IS STRING");
}

那么为什么String newName = mymap.get("name");会抛出错误Type mismatch: cannot convert from Object to String.

这是我用来初始化地图的地方,其中textName.getText()是在java swing GUI中输入的字符串:

Map<String,String> mymap = new HashMap<String,String>(10);
mymap.put("name", textName.getText()); 

这是相关代码:

public void actionPerformed(ActionEvent evt){
    Map<String,String> mymap = new HashMap<String,String>(10);
    mymap.put("name", textName.getText());

    makeDocx(mymap);
}

public static void makeDocx(Map mymap) {
    String newName = mymap.get("name");
    textReplace(oSelection, "[Name]", newName, oWord);
}

1 个答案:

答案 0 :(得分:2)

你的问题在于这个方法:

public static void makeDocx(Map mymap) {
    String newName = mymap.get("name");
    textReplace(oSelection, "[Name]", newName, oWord);
}

replacements被声明为Map,与Map<Object, Object>相同。您想要的是将其更改为Map<String, String>

public static void makeDocx(Map<String, String> mymap) {
    String newName = mymap.get("name");
    textReplace(oSelection, "[Name]", newName, oWord);
}

作为一般规则,如果您使用的是使用泛型的对象,但未声明您正在使用的类型,那么就会出现问题。一个好的IDE,比如Eclipse或Netbeans,会在Map replacements下发出警告,说你应该添加类型。


作为旁注,您可能想知道为什么要与Map<String, String> replacements进行Map replacements而不是String newName = (String) replacements.get("name");。想象一下,如果你调用方法makeDocx,但是在事故发生时你通过了Map<String, Integer>。这将导致程序尝试将Integer转换为String,这是不可能的。我们希望尽可能避免错误,因此我们应该确保强制地图为Map<String, String>