【问题标题】:Cannot cast object to hashmap无法将对象转换为哈希图
【发布时间】:2013-08-20 06:39:03
【问题描述】:

我的代码:

Object res =  stub.call(sessionId, "sale.list", "11111");
HashMap<String, String> map = (HashMap<String, String>) res;

将对象转换为 HashMap 我得到以下异常,

Exception in thread "main" java.lang.ClassCastException: [Ljava.util.HashMap;   
cannot be cast to java.util.HashMap

谁能帮助我如何检索对象数据?

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    异常消息表明stub.call(...) 方法正在返回HashMap[] 而不是HashMap

    “修复”就是这样做:

      HashMap<String, String>[] maps = (HashMap<String, String>[]) res;
    

    或者如果你知道数组将只包含一个元素,那么:

      HashMap<String, String> map = ((HashMap<String, String>[]) res)[0];
    

    不幸的是,这两种方法都会向您发出有关未经检查的转化的警告。避免这种情况的唯一方法是使用通配符/原始类型;例如

      HashMap<?, ?> map = ((HashMap<?, ?>[]) res)[0];
    

    【讨论】:

      【解决方案2】:

      你得到一个哈希映射数组,所以转换成数组:

      HashMap[] maps = (HashMap[]) res;
      

      【讨论】:

        【解决方案3】:

        只有当 stub.call(sessionId, "sale.list", "11111") 返回 HashMap 对象时,您才能将 res 转换为 HashMap

        [Ljava.lang.HashMap; 表示你得到的是一个 hashMap 数组,而不是单个 HashMap。

        【讨论】:

          【解决方案4】:
          Object res =  stub.call(sessionId, "sale.list", "11111");
          

          现在,如果您知道上面的代码返回一个 java.util.Map 或至少一个 java.util.HashMap,并且它遵循相同的泛型,那么您可以将其转换为 Map。或者至少,它应该返回一个空值。

          Map<String, String> map = (Map<String, String>) res; 
          

          【讨论】:

            【解决方案5】:

            如果你想将某些东西转换为其他东西,你可能知道 java 转换。在 Java 中有两种类型的引用变量强制转换。

            向下转换:如果您有引用子类型对象的引用变量,则可以将其分配给子类型的引用变量。您必须进行显式转换才能做到这一点,结果是您可以使用这个新的引用变量访问子类型的成员。

            向上转换:您可以显式或隐式地将引用变量分配给超类型引用变量。这是一个本质上安全的操作,因为赋值限制了新变量的访问能力。

            我从Java rules for casting引用这个

            【讨论】:

              【解决方案6】:

              许多对象都可以像这样成功地投射到地图上:

               Map<T, U> map = (Map<T, U>) res;
              

              但这些对象必须具有某种形式。 res 的通用形式必须是:

              res = {
               field1:field1_value,
               field2:field2_value,
               field3:field3_value,
               .
               .
              }
              

              但是,fieldx 必须可以隐式转换为 T 类型,而 fieldx_value 必须可以隐式转换为 U 类型。

              类似这样的:

              res = {A, B, C, ....}
              

              不能以上述方式转换为地图。 res 需要有键值对。但是, res 可以转换为如下所示的映射数组(具有一个或多个元素):

              [ {0:{A, B, C, ....}} ], that is a Map<Integer, Res>[]
              

              或者像这样:

              [{0:A}, {1:B}, {2:C}], that is a Map<Integer, type<A>>[]
              

              问题在于,无论哪种情况,T 类型的键和 U 类型的值是什么?其次,您必须明确地创建上面的两个映射以实现确定性。您可以使用 Java 流。

              【讨论】:

              • 这不适用于 Java。
              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-04
              • 2011-06-29
              • 1970-01-01
              • 2017-04-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多