【发布时间】:2019-07-28 22:06:46
【问题描述】:
在使用 Room 时,我在遍历应该包含预期类型对象的 List 的代码中遇到 ClassCastException。请参阅附加代码中的“FIXME”注释。
我尝试使用Person 和PersonEntity 而不是? extends Person,但结果没有变化。
基于 Room 示例,我使用存储库作为 DAO 和 ViewModel 之间的中介。使用单独的线程插入组信息和成员。
异常的堆栈跟踪:
E/AndroidRuntime:致命异常:AsyncTask #1 进程:我的项目,PID:7323 java.lang.RuntimeException:执行 doInBackground() 时出错 在 android.os.AsyncTask$3.done(AsyncTask.java:318) 在 java.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.Integer 无法转换为 myproject.model.Person 在 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;
}
}
以下类在存储库定义之外。
@Dao
public abstract class GroupDAO implements BaseDAO<GroupEntity>
{
@Insert(onConflict = OnConflictStrategy.IGNORE)
abstract void addGroupMember (GroupMemberEntity member);
@Insert(onConflict = OnConflictStrategy.IGNORE)
public void addGroupMember (int idGroup, int idPerson)
{
// GroupMemberEntity caters for the m:n association of Group and Person, using the id of each
GroupMemberEntity grp = new GroupMemberEntity(idGroup, idPerson);
addGroupMember(grp);
}
}
@Entity(tableName = "groups")
public class GroupEntity implements MutableGroup
{
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "group_id")
private int id = 0;
@ColumnInfo(name = "name")
private String name;
@Ignore
private List<? extends Person> m_members;
@Override
public List<? extends Person> getMembers ()
{ return m_members; }
public void setMembers (final List<? extends Person> members)
{ m_members = members; }
}
我不明白 List 怎么不包含 Person 对象。
【问题讨论】:
-
您可能想要编辑您的问题并发布完整的堆栈跟踪。
-
@CommonsWare 完成。堆栈跟踪中指示的第 609 行是我有“FIXME”注释的地方。
-
m_members是如何被填充的? -
@CommonsWare m_members 通过在从地图
提取列表后调用的setter 方法填充。我发现了问题。看我的回答。
标签: java android android-room