首页 > 解决方案 > 为什么我使用 Kotlin“is”操作符会出现“不兼容的类型”错误

问题描述

我一直在尝试在 Kotlin 中获取变量的类型,我发现可以这样做:

fun main(args: Array<String>) {
    var num1: Short = 1
    var num2 = 100000
    var num3 = 1000000000000
    var num4 = 3.14
    val numList: List<Any> = listOf(num1, num2, num3, num4)

    for(num in numList) {
        if (num is Short) {
            println("Short: $num")
        } else if (num is Int) {
            println("Int: $num")
        } else if (num is Long) {
            println("Long: $num")
        } else {
            println("$num not in listed types")
        }
    }
}

Output:
Short: 1
Int: 100000
Long: 1000000000000
3.14 not in listed types

...但我不能这样做:

fun main(args: Array<String>) {
    var num2 = 100000
    if (num2 is Long) {
        println("Long: $num2")
    } else {
            println("$num2 not in listed types")
        }
}


Output: 
    Kotlin: Incompatible types: Long and Int

为什么?有什么区别?

标签: kotlintyping

解决方案


请注意, 中的元素numList具有编译时类型Any

val numList: List<Any> = listOf(num1, num2, num3, num4)
                  ^^^

换句话说,num这里是类型Any

for(num in numList) {
    ^^^

检查是否num实际存储 aLong是允许的,因为编译器 知道它的类型是Any。它实际上可以Long在运行时存储 a 。

另一方面,当您声明和初始化 时num2,它的类型被推断为Int,因为100000Int文字。编译器知道num2永远不能在运行时存储 aLong因为它的类型是Int.

如果你使用Long文字100000L,那么你的代码会编译,你会得到一个警告,说它num2 is Long总是正确的。


推荐阅读