在 kotlin 中将匿名(任何)对象转换为类对象

Man*_*ore 7 casting class object kotlin

Kotlin 编译器在运行时给出错误如下:

fun main() {
    val x = object {
        val i = 1
        val k = "s"
    }
    val y = x as Planet
    if (y is Planet) {
        println("Hello " + x.i)
    }
}


data class Planet(
        var i : Int,
        var k : String
)
Run Code Online (Sandbox Code Playgroud)

错误 :


线程“main”中的异常 java.lang.ClassCastException:FileKt$main$x$1 无法在 Sun.reflect 处的 FileKt.main (File.kt:7 ) 处转换​​为 Planet .NativeMethodAccessorImpl.invoke0 (NativeMethodAccessorImpl.java:-2)

我无法理解为什么我无法将任何对象类型转换为特定的类对象。不是所有的 Kotlin 类都继承自 Any 超类吗?

请让我知道我在这里做错了什么。

Chr*_*anB 10

Kotlin 是一种强静态类型语言。每个变量和每个表达式都有一个在编译时已知的类型。

在您的示例中,您没有指定类型,但这并不意味着它在编译时是未知的。Kotlin 使用类型推断来确定其类型。就你而言Any

val x: Any = object {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Any是 Kotlin 类层次结构的根。每个 Kotlin 类都有Any一个超类。这就是为什么你不能在运行时强制转换的Any原因Planet

您可以做的是使用 Kotlin 安全强制转换as?,它返回 null 而不是异常:

val planet: Planet? = x as? Planet
Run Code Online (Sandbox Code Playgroud)

你还可以做的是,如果你曾经将一个星球投射到任何地方,你可以将它投射回星球。

data class Planet(val name: String)
    
val pluto: Planet = Planet("Pluto")
val anyPlanet: Any = pluto
val planet: Planet = anyPlanet as Pluto
Run Code Online (Sandbox Code Playgroud)