【问题标题】:HashMap get(Object) always returns String instead of other ObjectHashMap get(Object) 总是返回 String 而不是其他 Object
【发布时间】:2012-10-13 12:49:51
【问题描述】:

有一个问题让我很头疼。我有一个 HashMap 声明使用一个字符串作为键和我自己的 KWIKattribute 作为值。

private HashMap<String, KWIKattribute> attributes = new HashMap<String, KWIKattribute>();

我将对象放入其中,其中 sgml_xml_tag 是一个字符串,而 kattr 是 KWIKattribute 的一个实例。

attributes.put(sgml_xml_tag, kattr);

当我尝试将值作为 KWIKattribute 取回时

for (Map.Entry<String, KWIKattribute> e : attributes.entrySet()) {
        String key = e.getKey();
        KWIKattribute kattr = (KWIKattribute) attributes.get(e.getKey());
}

抛出异常

javax.faces.el.EvaluationException: java.lang.ClassCastException: java.lang.String cannot be cast to com.northgrum.adt.kwik.model.KWIKattribute

我知道这可能是我在某个地方的一个简单的愚蠢错误,但我没有看到它是什么。有什么建议吗?

【问题讨论】:

  • 你为什么不用e.getValue()
  • JSF 是什么版本的?它与 JSF javax.faces.el.EvaluationException 相关联。我认为您发布的代码不相关。你可以发布堆栈跟踪吗?
  • 真正的问题是为什么你需要在调用attributes.get() 之后进行转换?如果它正在做我们都认为的那样,那么该方法无论如何都应该返回一个KWIKattribute 引用。您是否有可能在本地范围内使用另一张地图遮蔽了 attributes 的声明?
  • 范围内没有其他地图。我在我的帖子中包含的实际上是我迄今为止唯一的代码(除了一些调试 println 语句),因为这个项目才刚刚开始。
  • 但这不是发生异常的地方。堆栈跟踪应该会有所帮助。

标签: java jsf


【解决方案1】:

而不是

KWIKattribute kattr = (KWIKattribute) attributes.get(e.getKey());

使用

KWIKattribute kattr = e.getValue();

您正在遍历地图的条目集。每个条目都包含一个键和与映射中该键关联的值。您可以直接从条目中获取值;没有必要像您那样在地图中查找它。

也就是说,您收到此错误很奇怪。首先,对KWIKattribute 的演员表根本不需要。其次,如果attributes真的是HashMap&lt;String, KWIKattribute&gt;,那么不可能有String对象作为值存储在其中。

【讨论】:

  • “不可能”是困扰我的地方。我从 e.getValue() 开始,它也返回了一个字符串。如果我执行 Object obj = e.getValue(),那么我打印 Object 的类,它是 java.lang.String。
  • 如果您将演员表移除到KWIKattribute,会发生什么?它仍然可以编译,还是出现错误?如果出现错误,那么 attributes 真的是 HashMap&lt;String, KWIKattribute&gt; 还是别的什么?
【解决方案2】:

Map.Entry-class 用于迭代 Map 的入口集,它有一个 getValue()-method,它将值返回给当前键。

否则,如果您只对 Map 中的值感兴趣,您也可以遍历 values-collection

for (KWIKattribute attr : attributes.values()){
  // Do your work with attr
}

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2021-12-31
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多