Java 返回列表包含整数而不是预期的类型,使用房间实体
在using Room中,我在代码中得到一个ClassCastException,它遍历一个应该包含预期类型对象的列表。请参阅所附代码中的“FIXME”注释 我试过使用Java 返回列表包含整数而不是预期的类型,使用房间实体,java,android,android-room,Java,Android,Android Room,在using Room中,我在代码中得到一个ClassCastException,它遍历一个应该包含预期类型对象的列表。请参阅所附代码中的“FIXME”注释 我试过使用Person和PersonEntity而不是?扩展Person,但结果没有变化 根据房间示例,我使用存储库作为DAO和ViewModel之间的中介。单独的线程用于插入组信息和成员 来自异常的堆栈跟踪: E/AndroidRuntime:致命异常:AsyncTask#1 流程:myproject,PID:7323 java.lang
Person
和PersonEntity
而不是?扩展Person
,但结果没有变化
根据房间示例,我使用存储库作为DAO和ViewModel之间的中介。单独的线程用于插入组信息和成员
来自异常的堆栈跟踪:
E/AndroidRuntime:致命异常:AsyncTask#1
流程:myproject,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)
运行(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)
此类位于repository类中
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;
}
}
私有静态类insertGroupTask扩展了AsyncTask
{
私人团体dao mAsyncTaskDao;
insertGroupTask(GroupDAO){
mAsyncTaskDao=dao;
}
@凌驾
受保护的Void doInBackground(最终GroupEntity…参数)
{
mAsyncTaskDao.insert(参数[0]);
//添加组成员。
ListMy bad。我发现setter方法setMembers(List members)实际上是在一个用例中获取成员ID(整数)列表,其中列表是从映射中检索的。
我对泛型中类型擦除的新理解是,即使在泛型中定义了用于编译的类型,它在运行时也会被视为“对象”。因此,列表本身的强制转换不会失败。第一个类型检查是在访问列表中的项时(在本例中,它是在创建后相对较长的时间内进行的).您可能需要编辑您的问题并发布完整的堆栈跟踪。@Commonware已完成。堆栈跟踪中指示的第609行是“修复我”的位置注释。m_成员
是如何填充的?@commonware m_成员是通过从映射中提取列表后调用的setter方法填充的。我发现了问题。请参阅我的答案。
@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; }
}