gpt4 book ai didi

java - 使用 Room Entity 返回列表包含整数而不是预期类型

转载 作者:行者123 更新时间:2023-12-02 09:39:07 45 4
gpt4 key购买 nike

在使用 Room 时,我在遍历应该保存预期类型对象的列表的代码中遇到 ClassCastException。请参阅所附代码中的“FIXME”注释。

我尝试过使用 PersonPersonEntity 而不是 ?扩展了 Person,但结果没有变化。

根据 Room 示例,我使用存储库作为 DAO 和 ViewModel 之间的中介。使用单独的线程来插入组信息和成员。

异常的堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process: myproject, PID: 7323 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:318) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to myproject.model.Person at myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:609) at myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:583) at android.os.AsyncTask$2.call(AsyncTask.java:304) at 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 对象。

最佳答案

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

关于java - 使用 Room Entity 返回列表包含整数而不是预期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57245306/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com