【问题标题】:HashMap ClassCastException String to MyClassHashMap ClassCastException String 到 MyClass
【发布时间】:2015-07-22 07:16:29
【问题描述】:

我想遍历一个 HashMap。

public void setMyHashMap(final String key,
        final HashMap<Integer, MyClass> value) throws NullPointerException{
        settings.put(key, value);
}

public HashMap<Integer, MyClass> getMyHashMap(String key) {
    return (HashMap<Integer, MyClass>) settings.get(key);
}
------------------------------------------------------------
for (Map.Entry<Integer, MyClass> e : settings.getMyHashMap(key)
                                             .entrySet()) {
    System.out.println(e.getValue());
}

这会显示对 MyClass 对象的引用,例如“MyClass@9d5f8e”

for (Map.Entry<Integer, MyClass> e : settings.getMyHashMap()
                                             .entrySet()) {
    System.out.println(e.getValue().getLabel());
}

但只要我想访问这个对象的数据,它就会被强制转换为 MyClass,这应该没问题,但不是。当我得到这个异常时,似乎该对象实际上是一个字符串:

java.lang.ClassCastException:java.lang.String 无法转换为 MyClass

我不明白。 我多次传递 HashMap 并且 SettingsClass 将存储的对象转换为 HashMap 没有问题。如果我打印该值,我将获得对 MyClass 的引用,但只要我想访问其中的数据,JRE 就会认为它是一个 String 对象。

【问题讨论】:

  • System.out.println(e.getValue().getClass());?
  • 显示更多关于你的代码
  • 请张贴putHashMap中的值所在的部分
  • jira 的设置库好像只支持 Lists 和 Maps 中的字符串...你怎么会知道,我觉得很蠢。
  • 什么是“设置”?如果这是 JIRA 本身或 SAL 中的 bean,您尝试使用它来持久化对象,请记住,插件的生命周期(以及因此类的生命周期)独立于 JIRA 使用的任何存储。例如,您可以存储一个对象,然后卸载您的插件。 MyClass 失败,但 obj 仍被存储。这样做的结果是,对于您要求 JIRA 本身坚持的任何事情,您通常只能使用 JRE 类和 JIRA-native 类。 (如果您需要存储自己的对象,请先将它们序列化为 XML。)

标签: java loops hashmap jira-plugin


【解决方案1】:

您的代码应该可以工作 - 我刚刚试了一下:

class MyClass {
    public String foo;
    public String bar;

    public String getLabel() {
        return "foo: " + foo + ", bar: " + bar;
    }
}

MyClass myObj1 = new MyClass();
myObj1.foo = "foo1";
myObj1.bar = "bar1";

MyClass myObj2 = new MyClass();
myObj2.foo = "foo2";
myObj2.bar = "bar2";

java.util.Map<Integer, MyClass> myHashMap = new java.util.HashMap<Integer, MyClass>();
myHashMap.put(1, myObj1);
myHashMap.put(2, myObj2);

for (java.util.Map.Entry<Integer, MyClass> e : myHashMap.entrySet()) {
    System.out.println(e.getValue().getLabel());
}

这产生了输出(如预期的那样):

foo: foo1, bar: bar1
foo: foo2, bar: bar2

【讨论】:

  • 应该可以,我是这么想的,但显然不行。
  • 能否调试代码并查看执行时映射中的实际内容?
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多