java - 无法将 HashMap 返回的对象转换为 Arraylist

标签 java casting

我将此代码作为 Java 应用程序在 Tomcat 服务器上运行。

if(levelMap.get(bssid_a) == null)
    continue;
ArrayList<String> levels_a = new ArrayList<String>();
levels_a = (ArrayList<String>)levelMap.get(bssid_a);

其中levelMap是一个hashmap,定义为:

HashMap<String, ArrayList<String>> levelMap

我收到此错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList

相同的代码在我的 Android 应用程序中运行,所以我不确定为什么会收到此错误。

原始函数(没有类型转换,但给了我同样的错误):

    public EDistance[] getLocation(HashMap<String, ArrayList<String>> levelMap) {

        HashMap<String, CrossProduct> crossProductList_local = new HashMap<String, CrossProduct>();

        LinkedHashSet<String> localList = (LinkedHashSet<String>) globalList.clone();

        Iterator<String> cpItera = localList.iterator();
        long time1 = System.currentTimeMillis();
        // Iterator<String> levelIter = levelMap.keySet().iterator();
        // try {

        while (cpItera.hasNext()) {

            String ssids[] = cpItera.next().split(",");
            String bssid_a = ssids[0];

            if(levelMap.get(bssid_a) == null)
                continue;
            //ArrayList<String> levels_a = new ArrayList<String>();
            ArrayList<String> levels_a = levelMap.get(bssid_a);
            double meanA = mean(levels_a, sampleSize, defaultLevel);

            // Iterator<String> cpIterb = localList.iterator();
            //
            // while(cpIterb.hasNext())
            // {

            String bssid_b = ssids[1];
            // if(bssid_a.equals(bssid_b))
            // continue;
            if(levelMap.get(bssid_b) == null)
                continue;
            //ArrayList<String> levels_b = new ArrayList<String>();
            ArrayList<String> levels_b = levelMap.get(bssid_b);
            double meanB = mean(levels_b, sampleSize, defaultLevel);
............

这是堆栈跟踪:

SEVERE: Failed to invoke method distance in class com.fingerprint.core.Calculate: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
org.apache.xmlrpc.common.XmlRpcInvocationException: Failed to invoke method distance in class com.fingerprint.core.Calculate: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
    at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:129)
    at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.execute(ReflectiveXmlRpcHandler.java:106)
    at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:46)
    at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
    at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
    at org.apache.xmlrpc.webserver.XmlRpcServletServer.execute(XmlRpcServletServer.java:112)
    at org.apache.xmlrpc.webserver.XmlRpcServlet.doPost(XmlRpcServlet.java:196)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
    at com.fingerprint.location.HyperbolicEuclideanDistance.getLocation(HyperbolicEuclideanDistance.java:235)
    at com.fingerprint.core.Calculate.distance(Calculate.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:115)
    ... 24 more
Caused by:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
    at com.fingerprint.location.HyperbolicEuclideanDistance.getLocation(HyperbolicEuclideanDistance.java:235)
    at com.fingerprint.core.Calculate.distance(Calculate.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:115)
    at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.execute(ReflectiveXmlRpcHandler.java:106)
    at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:46)
    at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
    at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
    at org.apache.xmlrpc.webserver.XmlRpcServletServer.execute(XmlRpcServletServer.java:112)
    at org.apache.xmlrpc.webserver.XmlRpcServlet.doPost(XmlRpcServlet.java:196)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

调用XMlRPC方法的代码:

public String getLocationXMLRPC(HashMap<String, ArrayList<String>> levelMap, String mapFile) {

    try {
        XMLRPCClient client = new XMLRPCClient("http://172.28.184.222:8080/LocationService/xmlrpc");

        Object[] params = new Object[]{levelMap, mapFile};
        //EDistance retura[] = (EDistance[]) client.callEx("Calculate.distance", params);
        String result = (String) client.callEx("Calculate.distance", params);
        return result;

    } catch (XMLRPCException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

调用错误函数的XMLRPC方法:

public String distance(HashMap<String, ArrayList<String>> levelMap, String mapFile)
{
    if(dist == null){
        dist = new HyperbolicEuclideanDistance(mapFile, 3, -130,
                false, "fake.txt");
        System.out.println("New Class created!");
    }
    EDistance[] result =  dist.getLocation(levelMap);

    StringBuilder build = new StringBuilder();

    for (int j = 0; j < result.length; j++) {
        if (result[j] != null)
            build.append(j + ") " + result[j] + "\n");
    }
    return build.toString(); 

}

调用服务器的代码:

public String getLocationXMLRPC(HashMap<String, ArrayList<String>> levelMap, String mapFile) {

    try {
        XMLRPCClient client = new XMLRPCClient("http://172.28.184.222:8080/LocationService/xmlrpc");


        String result = (String) client.call("Calculate.distance", levelMap, mapFile);
        return result;

    } catch (XMLRPCException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

最佳答案

根据ws-xmlrpc XMLRPC Data-Types一个HashMap<String, ArrayList<String>>不是直接支持的参数类型。

从您发布的异常堆栈跟踪中可以看到 HashMap<String, Object>沿着线路到达 XMLRPC 服务器。这是显而易见的,因为服务器需要调用 distance使用Java反射的方法。这样做的话,如果参数至少不是 HashMap,就会发生异常。相反,当从该映射检索对象时,跟踪中会发生异常。从 HashMap<String, ArrayList<String>> 检索和分配元素时,运行时会进行不可见的类型检查。 ,并且该检查失败,但您有异常(exception)。

因此,XMLRPC 库传递参数可能存在编码问题。所以,如Map<String, List<String>>根据上述文档应该是有效的参数类型,但尝试更改 distance方法及其被调用者参数,然后重试。

如果这也失败,请考虑以另一个更平坦和简单的结构传递参数。

关于java - 无法将 HashMap 返回的对象转换为 Arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11483772/

相关文章:

java - 通用整数类型到字符类型的转换

casting - 字典中包含的 AnyObject 类型的强制转换值

c - 警告初始化从指针生成整数,无需使用 fgets 进行强制转换

android - 我们如何将上下文转换为 fragment 引用?

java - postgresql 错误接近于 java

java - 处理存储为 HashMap 的 Json,其中多个元素存储在值中

java - 使用 eclipse microprofile-config 自定义配置文件

sql - 从两个数字构造几何类型

java - App Engine 云存储 RequestPayloadTooLargeException 文件超出 10 MB 限制

java - 如何用一个替换字符串中的多个斜杠和反斜杠?