android - 有没有办法在不使用 Kotlin 中的 Supress 的情况下处理未经检查的强制转换警告?

标签 android kotlin unchecked-cast

我在我的 android 应用程序中使用 ViewModelFactory 将一些数据从 Fragment 传递给我的 ViewModel。我收到未经检查的类型转换警告。如果我使用抑制,警告就会消失。我想知道有没有办法在不使用 Supress("UNCHECKED_CAST") 的情况下处理这个问题

我用来创建 ViewModelFactory 的代码

val factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
        //factory to pass necessary data to ViewModel
        @NonNull
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return activity?.application?.let {
                BookReaderViewModel(
                    it,
                    "local",//todo:remote or local book. value will come from arguments
                    1//todo: bookId will come from arguments
                )
            } as T
        }
    }

因为 T 收到警告。

最佳答案

不,未经检查的强制转换意味着编译器不能保证强制转换会失败或成功。

在大多数情况下,您无法添加任何内容来更改它,因为编译器根本没有足够的信息。这通常发生在类属周围,因为 T 可以代表许多不同的类型。
您必须在转换之前添加正确的类型检查,以确保转换成功。

您可以抑制警告。通过这样做,您作为开发人员,向编译器保证您确信强制转换将始终成功。

代码本身不能做出这样的 promise 。如果 create除了 BookReaderViewModel 以外的任何东西都会调用函数它会崩溃,因为类型转换不成功。

这是一个可以安全地抑制警告的示例,因为它会在强制转换之前进行检查:

    @NonNull
    @Supress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        val application = activity?.application ?: return null
        if (modelClass == BookReaderViewModel::class.java) {
            return BookReaderViewModel(
                application,
                "local",
                1) as T
        }
        // return null or throw exception here
        throw IllegalArguentException("Factory cannot make ViewModel of type ${modelClass.simpleName}")
    }

关于android - 有没有办法在不使用 Kotlin 中的 Supress 的情况下处理未经检查的强制转换警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61520115/

相关文章:

Java:通用类型转换,我该如何解决这个问题,这样我就不会抑制未经检查的警告

Java 反射 : (Type) field. get(object) - 未经检查的转换

java - 不能在 adListener 中使用 sharedPreference

android - 等待 Kotlin 协程在 onCreateView() 中完成

java - 按下按钮

android - 在应用程序级别观察数据

android - 如何关闭/退出android中的应用程序?

android - 复选框默认值 & OnCheckedChangeListener

Android - 是否可以通过编程方式访问 androidTest 和测试文件夹中的工具化测试和单元测试类?

java - 如果 Object instanceof HashMap 如何检查键和值的类型?