Android、Mandrill和Parse.com:Java ClassCastException:HashMap不能强制转换为类

Android、Mandrill和Parse.com:Java ClassCastException:HashMap不能强制转换为类,java,javascript,arrays,parse-platform,mandrill,Java,Javascript,Arrays,Parse Platform,Mandrill,我不知道问题是否源于这么久以前,所以我会告诉你的。我有一个存储为Parse Cloud代码的函数,根据Parse和Mandrill API文档检索用户的预定电子邮件列表。然而,根据他们的文档,Mandrill返回的对象是一个包含字符串键值对的结构数组。您可以在此处查看相关文档: 解析云代码只能使用Javascript,所以我不确定返回的数组是如何被它解释的。无论哪种方式,我都让云函数将返回的数组直接返回给在我的Android应用程序中调用它的Java方法。我以为它会以JSONArray的形式出现

我不知道问题是否源于这么久以前,所以我会告诉你的。我有一个存储为Parse Cloud代码的函数,根据Parse和Mandrill API文档检索用户的预定电子邮件列表。然而,根据他们的文档,Mandrill返回的对象是一个包含字符串键值对的结构数组。您可以在此处查看相关文档:

解析云代码只能使用Javascript,所以我不确定返回的数组是如何被它解释的。无论哪种方式,我都让云函数将返回的数组直接返回给在我的Android应用程序中调用它的Java方法。我以为它会以JSONArray的形式出现,但事实似乎并非如此。我的编辑器androidstudio坚持返回类型为
ArrayList
,不允许我使用任何其他参数类型,因此我将其设置为该类型。(ScheduledEmail是我用Java创建的类,用于匹配Mandrill返回的结构中包含的元素。这是我出错的地方吗?如何将返回数组中的结构转换为Java兼容的键值对?),我收到这个错误:

    java.lang.ClassCastException: java.util.HashMap cannot be cast to com.****.******.ScheduledEmail
似乎没有任何地方使用过HashMap。我错过了什么?在将返回的数组发送回Java方法之前,我是否应该先对它做些什么?Mandrill是否返回了HashMap?如果是这样,为什么它会被解释为我想要匹配的Java类

有关Java方法的相关部分如下所示:

HashMap<String, Object> params = new HashMap<String, Object>();
params.put("recipient", "koolstr@gmail.com");
ParseCloud.callFunctionInBackground("listScheduledEmails", params, new FunctionCallback<ArrayList<ScheduledEmail>>() {
    public void done(ArrayList<ScheduledEmail> schedEmailsFromJS, ParseException e) {
        if (e == null) {
            for (int i=0; i < schedEmailsFromJS.size(); i++) {

                //This is the line which produces the error
                Log.d("sEmail", schedEmailsFromJS.get(i).get_id());
            }
        }
    }
});

任何帮助、想法、澄清或批评都将不胜感激。我在这个问题上被困了半天,似乎解决不了。我不知道哪里出了问题。

您首先需要找出传递给
函数回调的类型:

ParseCloud.callFunctionInBackground("listScheduledEmails", params, new FunctionCallback<Object>() {
    public void done(Object o, ParseException e) {
        if (e == null) {
            Log.i("Tag", "Return type = " + o.getClass().getName());
        }
    }
});

哪个Java语句引发异常?正如我在发布的代码中以注释的形式编写的,这是产生错误的一行:
Log.d(“sEmail”,schedEmailsFromJS.get(I).get_id())。我尝试使用数组做什么并不重要。我甚至尝试过这个,但它产生了相同的错误:
ScheduledEmail test=schedEmailsFromJS.get(0)谢谢你的天才方法。日志显示对象类型是ArrayList,其中的对象是HashMaps。那么,为了能够正确地将此ArrayList解析为可用数据,我的代码中现在应该做哪些更改呢?非常感谢!成功了!我只需要把它做成一个ArrayList而不是一个列表,这样它就可以打包,这样我就可以把它发送到另一个活动。另外,在编写
Log.I(“Return type=“+o.getClass().getName()”)时,我忘了提到这一点,您忘记包含字符串标记。明白了。更正了我的答案。
ParseCloud.callFunctionInBackground("listScheduledEmails", params, new FunctionCallback<Object>() {
    public void done(Object o, ParseException e) {
        if (e == null) {
            Log.i("Tag", "Return type = " + o.getClass().getName());
        }
    }
});
ParseCloud.callFunctionInBackground("listScheduledEmails", params, new FunctionCallback<List<Map>>() {
    public void done(List<Map> list, ParseException e) {
        if (e == null) {
            ArrayList<ScheduledEmail> scheduledEmails = new ArrayList<>();

            for(Map<String, ?> data : list) {
                ScheduledEmail scheduledEmail = new ScheduledEmail();
                scheduledEmail.set_id(data.get("_id"));
                // ... extract rest of data

                scheduledEmails.add(scheduledEmail);
            }
        }
    }
});