首页 > 解决方案 > Kotlin - `if` 和 `when` 表达式的类型

问题描述

我知道 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时推断类型?

标签: kotlinjvmstatic-typing

解决方案


实际上,在这种情况下,when 表达式的类型解析为Any,因此y变量可以具有任何值。IDE 甚至会警告您,Conditional branch result of type X is implicitly cast to Any至少 Android Studio 和Kotlin Playground都会这样做。


推荐阅读