Kotlin - `if` 和 `when` 表达式的类型

标签 kotlin jvm static-typing

据我所知,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 的类型?

最佳答案

实际上,在这种情况下,when 表达式的类型解析为 Any,因此 y 变量可以具有任何值。 IDE 甚至警告您,类型 X 的条件分支结果隐式转换为 Any,至少 Android Studio 是这样,以及 Kotlin Playground .

关于Kotlin - `if` 和 `when` 表达式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58479824/

相关文章:

unit-testing - 自动化单元测试可以代替静态类型检查吗?

java - 尝试增加 jvm 内存时,您可以将 Xmx 设置为最大数量吗?

java - Kotlin:如何在运行时的 OneClass<T> 中获取实际的泛型类型 T

java - AV Pipeline Kit Demo 不工作,有什么问题?

java - 如何使用 java/kotlin 中的注释处理将方法附加到现有类?

jenkins - 下载Docker Jenkins镜像后在Ubuntu中找不到jenkins_home文件夹

java - `instanceof` 是否产生静态类型限定符?

types - 如何从 Int 派生出自己的区分类型?

java - MutableListclear() 和 addAll() 行为奇怪

android-studio - 如何在 kotlin 中找到硬编码的字符串