【发布时间】:2019-10-21 04:29:11
【问题描述】:
我了解 Kotlin 是一种静态类型语言,所有类型都是在编译时定义的。
这是一个返回不同类型的when 表达式:
fun main(){
val x = readLine()?.toInt() ?: 0
val y = when(x){
1 -> 42
2 -> "Hello"
else -> 3.14F
}
println(y::class.java)
}
在运行时(JVM 1.8 上的 Kotlin 1.3.41)这是输出:
当x = 1 时,它会打印class java.lang.Integer
当x = 2 时,它会打印class java.lang.String
否则,它会打印class java.lang.Float
编译器什么时候确定y的类型?或者,编译器如何在编译时推断y的类型?
【问题讨论】:
-
y很可能被键入为Any,这是所有类型的通用超类型。换句话说,通过显式输入,它看起来像val y: Any = when(x) {...}。 -
@Slaw 这就是我的猜测,但想知道
Any如何在println(y::class.java)语句中转换为Integer、String等。 -
不是。变量的声明类型和它引用的对象的实际类型是有区别的。这和
val x: Any = "Hello, Wold!";没什么不同。
标签: kotlin jvm static-typing