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)