为了账号安全,请及时绑定邮箱和手机立即绑定

返回列表包含整数而不是预期类型,使用房间实体

返回列表包含整数而不是预期类型,使用房间实体

暮色呼如 2023-04-26 14:23:21
在使用 Room 时,我在遍历应该包含预期类型对象的列表的代码中遇到了 ClassCastException。请参阅所附代码中的“FIXME”注释。我试过使用PersonandPersonEntity而不是? extends Person,但结果没有变化。基于 Room 示例,我使用存储库作为 DAO 和 ViewModel 之间的中介。一个单独的线程用于插入组信息和成员。来自异常的堆栈跟踪:E/AndroidRuntime:致命异常:AsyncTask #1 进程:myproject,PID:7323 java.lang.RuntimeException:在 java.os.AsyncTask$3.done(AsyncTask.java:318) 处执行 doInBackground() 时发生错误。 util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:223) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android .os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 607)在 java.lang.Thread.run(Thread.java:761)引起:java.lang.ClassCastException:java.lang。整数无法在 myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:609) 在 myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:583) 在 android.os.AsyncTask $2.call(AsyncTask.java:304) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237)此类在存储库类中private static class insertGroupTask extends AsyncTask<GroupEntity, Void, Void>{    private GroupDAO mAsyncTaskDao;    insertGroupTask(GroupDAO dao) {        mAsyncTaskDao = dao;    }    @Override    protected Void doInBackground (final GroupEntity... params)    {        mAsyncTaskDao.insert(params[0]);        // Add group members.        List<? extends Person> members = params[0].getMembers();        if (members == null || members.size() == 0)            return null;        // FIXME: A ClassCastException occurs (Integer instead of Person).        for (Person p : members) // FIXME: How can members be a list containing Integer objects? See getMembers() in GroupEntity        {            mAsyncTaskDao.addGroupMember(params[0].getId(), p.getId());        }        return null;    }}
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

我的错。我发现 setter 方法 setMembers(List members) 实际上是在一个用例中获取成员 ID(整数)列表,其中列表是从 Map 中检索的。我对泛型中类型擦除的新理解是,即使类型在泛型中定义用于编译,它在运行时也被视为“对象”。因此,List 本身的任何转换都不会失败。第一个类型检查是在访问列表中的项目时(在本例中,它在创建后相对较长)。



查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信