kotlin - 为什么这个 Actor 不会失败?

标签 kotlin

正在测试强制转换、列表等的行为,但遇到了一些我无法弄清楚的事情。将列表转换为不同类型的列表时,不会引发异常,使用安全转换时也不会导致 null。这是为什么呢?

data class Rectangle(val width: Int, val height: Int)
data class Circle(val radius: Int)

fun main(args: Array<String>) {
    val listOfRects: List<Rectangle> = listOf(Rectangle(5,5))

    val listOfUnkown: List<Any?> = listOfRects

    val listOfWrongType: List<Circle> = listOfUnkown as List<Circle>
    // also works, thought should throw null
    // val listOfWrongType: List<Circle>? = listOfUnkown as? List<Circle>

    print(listOfWrongType)
}

输出

Test.kt:9:44: warning: unchecked cast: List<Any?> to List<Circle>
    val listA: List<Circle> = listOfUnkown as List<Circle>
                                           ^
[Rectangle(width=5, height=5)]

当我将列表设置为健全性检查时,我还尝试制作列表的深拷贝。

最佳答案

在 Kotlin 中,有关泛型类型的实际类型参数的信息在运行时会被删除,因此在强制类型转换期间无法检查类型参数。

这正是未经检查的 Actor 阵容以及警告告诉您的内容。您可以进行这样的转换,但您必须接受 suppressing the warning 在运行时可能存在类型不匹配。 .

查看语言引用:

相关问答:

关于kotlin - 为什么这个 Actor 不会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118632/

相关文章:

enums - Kotlin-使用枚举检索字符

android - 如何从先前生成的 ECDSA 编码 key 对构造私钥?

android - 如何使用 Jetpack Composite 刷新 map 上的集群标记?

android - 如何在 Android 中突出显示设置行?

spring-boot - Junit 5 与 Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryListener()

constructor - 如何在 Kotlin 中扩展具有多个构造函数的类?

android - Kotlin Anko自定义 View 父范围

java - 如何在 Gradle 中共享通用测试依赖版本?

android - 声明为不可为 null 的 Kotlin 属性即使已初始化值也可以为 null

android - Kotlin 中的 Activity 转换