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

Why does let not give me a non nullable integer in this case

对 Kotlin 相当陌生 - 我有点困惑为什么 在此示例中使用 let 时 'it' 仍然可以为空? 结果该示例无法编译

Error:(9, 20) Type mismatch: inferred type is Int? but Int was expected

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

let {} 不会改变变量的类型。你想要做的是让它成为空安全的。这是通过 ?. 访问

完成的
myNewNullableInt?.let{
    printAnInteger(it)
}

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

您必须使用安全调用运算符,写作 ?.

To perform a certain operation only for non-null values, you can use the safe call operator together with 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-cast。

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