2

我的代码:

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

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

4

6 回答 6

7

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

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

于 2013-08-20T06:46:27.777 回答
7

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

HashMap[] maps = (HashMap[]) res;
于 2013-08-20T06:53:22.963 回答
4

异常消息表明该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];
于 2013-08-20T06:57:31.850 回答
1
Object res =  stub.call(sessionId, "sale.list", "11111");

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

Map<String, String> map = (Map<String, String>) res; 
于 2013-08-20T06:50:52.127 回答
0

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

Downcasting:如果你有一个引用变量引用了一个子类型对象,你可以将它分配给子类型的一个引用变量。为此,您必须进行显式强制转换,结果是您可以使用这个新的引用变量访问子类型的成员。

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

我从Java 的强制转换规则中引用了这一点

于 2013-08-20T06:56:27.267 回答
0

许多对象可以像这样成功地转换为地图:

 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 流。

于 2021-11-20T16:57:45.097 回答