如何解决‘Object无法转换为List’编译错误?
解决Object无法转换为List的类型不兼容问题
问题代码
@Entity(tableName = DBConstants.TABLE_USER_PROFILE, indices = {@Index(value = {DBConstants.COL_USER_PROFILE_USERID}, unique = true)}) public class User extends BaseProfileInfo implements Serializable { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = DBConstants.COL_USER_PROFILE_ROWID) private int rowId; @SerializedName(DBConstants.COL_USER_PROFILE_USERID) @ColumnInfo(name = DBConstants.COL_USER_PROFILE_USERID) private int id; @SerializedName(DBConstants.COL_USER_PROFILE_SNOMED_ALERGIES) @ColumnInfo(name = DBConstants.COL_USER_PROFILE_SNOMED_ALERGIES) @Nullable public List<SnomedAllergy> snomed_allergies = null; }
编译报错
error: incompatible types: Object cannot be converted to List
_item_1.snomed_allergies = CommonConverter.fromObjectString(_tmp_3);
解决方法
方法1:修改CommonConverter,支持泛型类型转换
把fromObjectString改为泛型方法,让它可以返回指定类型的对象:
public class CommonConverter { public static <T> T fromObjectString(String json, Type type) { // 以Gson为例实现转换逻辑,可替换为项目使用的JSON库 return new Gson().fromJson(json, type); } }
调用时指定List<SnomedAllergy>的类型:
_item_1.snomed_allergies = CommonConverter.fromObjectString( _tmp_3, new TypeToken<List<SnomedAllergy>>(){}.getType() );
方法2:直接强制类型转换(需确保类型安全)
如果无法修改CommonConverter,可直接做强制类型转换并处理警告:
@SuppressWarnings("unchecked") _item_1.snomed_allergies = (List<SnomedAllergy>) CommonConverter.fromObjectString(_tmp_3);
注意:必须保证fromObjectString返回的Object确实是List<SnomedAllergy>类型,否则运行时会抛出ClassCastException。
方法3:使用Room的TypeConverter自动处理列表存储(推荐)
因为User是Room Entity类,Room默认不支持直接存储List类型,正确做法是通过TypeConverter实现List与String互转:
- 定义转换器类:
public class SnomedAllergyConverter { @TypeConverter public static List<SnomedAllergy> fromString(String json) { Type listType = new TypeToken<List<SnomedAllergy>>() {}.getType(); return new Gson().fromJson(json, listType); } @TypeConverter public static String fromList(List<SnomedAllergy> allergies) { Gson gson = new Gson(); return gson.toJson(allergies); } }
- 在Room Database类上注册转换器:
@Database(entities = {User.class}, version = 1) @TypeConverters(SnomedAllergyConverter.class) public abstract class AppDatabase extends RoomDatabase { // DAO定义 }
之后Room会自动处理snomed_allergies字段的存储与读取,无需手动调用CommonConverter,从根源避免类型转换问题。
内容的提问来源于stack exchange,提问作者Krishna Dhas
相关产品推荐
相关产品推荐

