HashMap <integer,string =“”>存储String [](Atlassian Confluence)

时间:2018-03-21 11:31:29

标签: java hashmap confluence

所以我正在处理Atlassian Confluence的插件,在配置页面的控制器中,我有一个类型HashMap<Integer, String>的HashMap,我用HTML表单中的值填充。现在提交表单后,我尝试用.get(key)从该HashMap中读取一个值,并将其安全地写入String。我收到了这个类型转换错误:java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String。所以我用调试器查看了这些值,当然我的HashMap包含用长度为1的数组包裹的字符串而不是普通的简单字符串:即使我的HashMap很难用类型Integer-&gt; String定义,但是String的赋值没有任何作用明确的类型转换。这真让我困惑。我想这与自动反序列化POST值的Atlassian东西有关;在过去,这已经花了我很多麻烦,因为没有适当的文档和神奇的背景转换有很多怪癖。令我困惑的是,HashMap可以突然存储不同于定义的类型的值,我不会认为Java可以将这种注意力放在类型安全上。是否有一些可以做到这一点的反思foo,我没有意识到?还是我误解了HashMaps的本质?有没有人经历过类似的事情?我在Java编码方面没有经验。

1 个答案:

答案 0 :(得分:1)

如果您将hashmap创建为HashMap<Integer, String>()但将其存储为HashMap,则确实可以存储其他类型。

例如:

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

此代码执行时没有任何错误。

所以我认为发生的事情就是你将它存储为HashMap引用,它被视为HashMap<Object, Object>,并且没有关于实际泛型类型的运行时信息,你可以添加对象该系列的其他类型。

但是,如果您使用HashMap<Integer, String>对同一地图进行了另一次引用,那么当您调用get()时,它会失败,并且您将描述以下异常:

    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