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

时间:2019-07-28 22:06:46

标签: java android android-room

在使用Room时,我在遍历List的代码中遇到了ClassCastException,该List应该包含预期类型的​​对象。请参阅附带的代码中的“ FIXME”注释。

我尝试使用“ Person”和“ PersonEntity”而不是“?extended Person”,但是结果没有变化。

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

// This class is in the repository class
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;
    }
}

// Classes below are outside the repository definition.

@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; }
}

我不明白列表中不包含Person对象。

1 个答案:

答案 0 :(得分:1)

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