android - 无法检查已删除类型的实例 : List<Occupation_Info>

标签 android kotlin

我在函数中获取列表时遇到错误

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/

相关文章:

java - ViewPager fragment 中的 ListView

android - 仅通过WiFi接口(interface)发送POST请求

java - 从java调用异步kotlin方法

java - 使用 Uri 创建文件后文件为空 - Retrofit

android - Android 中样式和主题的优先级是什么?

Android Gallery - 使用不同的过渡效果,例如淡入

android - Android按钮点击事件的Kotlin协程流程示例?

intellij-idea - Gradle Kotlin脚本,>找不到ID为 `kotlin`的插件

android - 使用 kotlin 在 android 中获取屏幕截图的最简单方法是什么?

kotlin - 如何配置 build.gradle.kts 来修复错误 "Duplicate JVM class name generated from: package-fragment"