Java HashMap<;整数,字符串>;存储字符串[](Atlassian Confluence)

Java HashMap<;整数,字符串>;存储字符串[](Atlassian Confluence),java,hashmap,confluence,Java,Hashmap,Confluence,因此,我正在为Atlassian Confluence开发一个插件,在配置页面的控制器中,我有一个类型为HashMap的HashMap,我用HTML表单中的值填充它。现在,在提交表单之后,我尝试使用.get(key)从HashMap中读取一个值,并将其保存到字符串中。我得到这个类型转换错误:java.lang.ClassCastException:[Ljava.lang.String;无法转换为java.lang.String。因此,我使用调试器查看了这些值,并确信我的HashMap包含长度为1

因此,我正在为Atlassian Confluence开发一个插件,在配置页面的控制器中,我有一个类型为
HashMap
的HashMap,我用HTML表单中的值填充它。现在,在提交表单之后,我尝试使用
.get(key)
从HashMap中读取一个值,并将其保存到字符串中。我得到这个类型转换错误:
java.lang.ClassCastException:[Ljava.lang.String;无法转换为java.lang.String
。因此,我使用调试器查看了这些值,并确信我的HashMap包含长度为1的数组中包装的字符串,而不是简单的字符串:甚至我的HashMap也清楚地定义为类型Integer->String,并且对字符串的赋值没有任何显式的类型转换。这真的让我很困惑。我想这与自动反序列化POST值的Atlassian东西有关;在过去,这已经让我很头疼,因为没有合适的文档,神奇的背景转换有很多怪癖。真正让我困惑的是HashMap可能会突然出现如果只存储不同类型的值而不存储定义的值,我认为Java如此关注类型安全是不可能的。是否有一些反射foo可以做到这一点,我不知道?或者我误解了HashMaps的本质?有人经历过类似的事情吗?我在Java编码方面没有经验。

在ca中您正在将hashmap创建为
hashmap()
,但将其存储为
hashmap
确实可以存储其他类型

例如:

    HashMap map = new HashMap<Integer, String>();
    map.put(1, new String[]{"1", "2"});
    System.out.println(map.get(1));

真正让我困惑的是HashMap可以突然存储与定义不同类型的值,我认为Java如此关注类型安全是不可能的。对于任何正在使用Atlassian xwork/velocity表单的人来说,显然是
字段[1]
映射语法不起作用。也许
字段.1
可以起作用,点语法对于嵌套对象(如果在类上使用@ParameterSafe)很好。数组以
的形式工作,而不是
    HashMap map = new HashMap<Integer, String>();
    map.put(1, new String[]{"1", "2"});
    System.out.println(map.get(1));
    System.out.println("got here");
    HashMap<Integer, String> otherRef = (HashMap<Integer, String>) map;
    System.out.println(otherRef.get(1)); //<-ClassCastException exception here