【问题标题】:Why does this cast NOT fail?为什么这个演员不会失败?
【发布时间】:2019-07-19 19:29:19
【问题描述】:

正在测试强制转换、列表等的行为,但遇到了一些我无法弄清楚的事情。将列表转换为不同类型的列表时,不会引发异常,使用安全转换时也不会导致 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


    【解决方案1】:

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

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

    查看语言参考:

    相关问答:

    【讨论】:

    • 我想那是因为它们是data 类,默认为toString,这就是为什么即使类型错误也可以正常打印的原因。但是,如果我尝试访问属于特定类型的东西,我会得到一个异常吗?
    • 是的,如果在错误假设实际类型参数的情况下进行了未经检查的强制转换,当代码尝试访问元素的特定类型成员时,您将得到一个ClassCastException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多