【问题标题】:Why do I get "Incompatible Types" error using Kotlin "is" opeator为什么我在使用 Kotlin “is”运算符时会出现“不兼容的类型”错误
【发布时间】:2021-10-14 16:15:14
【问题描述】:

我一直在尝试在 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

为什么?有什么区别?

【问题讨论】:

    标签: kotlin typing


    【解决方案1】:

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

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

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

    for(num in numList) {
        ^^^
    

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

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

    如果您使用 Long 文字 100000L,那么您的代码将编译,您将收到一条警告,指出 num2 is Long 始终为真。

    【讨论】:

      【解决方案2】:

      第二种情况编译器知道检查不能成功,因为它知道num2Int,所以不能是Long。第一种情况它不知道num的类型是什么(是Any),因为numList包含各种类型的对象,所以允许检查。

      换句话说,检查某种动物是否是狗是有意义的。但是,检查某只猫是否是狗是没有意义的。

      【讨论】:

        【解决方案3】:

        这是因为编译器在第二个版本中理解num2 只能是Int,因此会出现错误。

        在第一个版本中,您正在测试num,它基本上可以是任何东西(注意List&lt;Any&gt; 类型),因此编译器无法告诉您这些类型不兼容。以下代码(您的第一个示例的更改版本)会遇到同样的问题:

        fun main() {
            var num2 = 100000
            val numList: List<Int> = listOf(num2)
        
            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")
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-30
          • 1970-01-01
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          • 2012-02-07
          • 2021-07-25
          • 2020-11-19
          相关资源
          最近更新 更多