代码之家  ›  专栏  ›  技术社区  ›  Chris Nevill Trevor Johns

在这种情况下,为什么不给我一个不可为空的整数

  •  -1
  • Chris Nevill Trevor Johns  · 技术社区  · 7 年前

    对科特林来说相当陌生——我有点不明白为什么 在本例中使用let时,“it”仍然可以为null?

    错误:(9,20)类型不匹配:推断的类型是Int?但是Int是

    fun main(args: Array<String>) {
        val myNewNullableInt: Int? =6
        myNewNullableInt.let{
            printAnInteger(it)
        }
    
    }
    
    fun printAnInteger (integerToPrint: Int){
        println(integerToPrint)
    }
    

    https://try.kotlinlang.org/#/UserProjects/fnlicstrn4tbmk8gs071vmv4ka/9dd72cr92ikggh3g9qg981h01o

    2 回复  |  直到 7 年前
        1
  •  5
  •   tynn    7 年前

    let {} 不会更改变量的类型。您要做的是使其为空安全。这是通过 ?. 通道

    myNewNullableInt?.let{
        printAnInteger(it)
    }
    
        2
  •  1
  •   leonardkraemer    7 年前

    看见 https://kotlinlang.org/docs/reference/null-safety.html

    您必须使用安全呼叫接线员,书面通知 ?.

    要仅对非空值执行特定操作,可以使用 安全呼叫接线员和let:

    val listWithNulls: List<String?> = listOf("Kotlin", null)
    for (item in listWithNulls) {   
        item?.let { println(it) } // prints A and ignores null
    }
    

    作为第二个选项,您可以使用-运算符(小心使用,如果为空,它将抛出NPE)

    val myNewNullableInt: Int? =6
    myNewNullableInt!!.let{ //throws if myNewNullableInt == null
        printAnInteger(it)
    }
    

    因为您使用的是不可变的 val 您还可以使用`if(myNewNullableInt!=null)。Kotlin将识别null检查并自动转换为不可为null的类型。你可以通过AndroidStudio或Idea的绿色标记看到smart演员阵容。

    val myNewNullableInt: Int? =6
       if(myNewNullableInt != null) {
               printAnInteger(myNewNullableInt )
       }
    

    enter image description here