我在函数中获取列表时遇到错误
fun insert(insert_info_list: List<Any>){
viewModelScope.launch(Dispatchers.IO) {
when(insert_info_list){
is List<Occupation_Info> ->{
insert_info_list.forEach {
var show_occupation_info=Occupation_Info(it.occupation_id,it.fn,it.fv)
db.daoOccupationInfo().insertOrUpdate(show_occupation_info)
}
}
}
}
}
最佳答案
这是因为type erasure .
要解决这个问题,一种选择是将类型检查移到循环内。这并不完全等同于您上面尝试做的事情,所以要小心。您可能有一个对象列表,其中某些对象实现了多种类型。
在下面的代码中,我删除了对 Dispatcher 的指定,因为如果您将 DAO 函数标记为挂起
,则没有必要。
fun insert(insert_info_list: List<Any>){
viewModelScope.launch {
for (item in insert_info_list) {
when(item) {
is Occupation_Info -> {
var show_occupation_info = Occupation_Info(item.occupation_id, item.fn, item.fv)
db.daoOccupationInfo().insertOrUpdate(show_occupation_info)
}
// is...
}
}
}
}
或者您可以将输入列表的类型具体化,以便您可以检查它。这样做的缺点是调用站点的编译器必须知道列表的类型。
inline fun <reified T> insert(insert_info_list: List<T>){
viewModelScope.launch {
@Suppress("UNCHECKED_CAST")
when (T::class) {
Occupation_Info::class -> (for item in (insert_info_list as List<Occupation_Info>)) {
var show_occupation_info = Occupation_Info(item.occupation_id, item.fn, item.fv)
db.daoOccupationInfo().insertOrUpdate(show_occupation_info)
}
// SomethingElse::class...
}
}
}
可能最好的解决方案是为您想要支持的每种类型的列表提供单独的 insert
函数,这样您就不必进行类型检查,这是一种代码味道。如果您对处理的每种类型的列表执行一些通用操作,则可以将该通用代码分解为每个插入函数调用的私有(private)函数。
关于android - 无法检查已删除类型的实例 : List<Occupation_Info>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69177383/