Kotlin 多么不同的StringBuilder和StringBuilder!在科特林?

Kotlin 多么不同的StringBuilder和StringBuilder!在科特林?,kotlin,Kotlin,在下面的代码中。我在Intellij Idea编译器中发现,默认情况下,val a和val b是val a:StringBuilder&val b:StringBuilder 这两者的区别是什么?StringBuilder和StringBuilder之间有什么区别?谢谢各位: fun main(){ val a = StringBuilder().apply { // by default is val a : StringBuilder append("Hel

在下面的代码中。我在Intellij Idea编译器中发现,默认情况下,val a和val b是val a:StringBuilder&val b:StringBuilder

这两者的区别是什么?StringBuilder和StringBuilder之间有什么区别?谢谢各位:

fun main(){
    val a = StringBuilder().apply { // by default is val a : StringBuilder
        append("Hello ")
        append("from me")
    }
    println(a)

    val b = StringBuilder().run { // by default is val b : StringBuilder!
        append("Hello ")
        append("from me")
    }
    println(b)
}
这个!表示一个。这意味着编译器无法判断该类型是否可为null,因为它来自Java或其他JVM语言,不区分可为null的类型和不可为null的类型,也没有注释@nullable或@NonNull来表示这一点

因此,编译器将无法进行通常的空检查,因此您应该小心

如果您从文档中知道,或者查看Java代码,或者不管值是否可以为null,那么最好将类型显式指定为带尾随?的可空类型,或者不带尾随?的不可空类型

在这种情况下,区别在于apply返回调用它的值;这就是Kotlin,所以编译器知道它的类型。但是,run返回lambda中的最后一个值,这是最后一个append调用的结果。该方法是在Java中定义的,因为StringBuilder是Java标准库的一部分,所以编译器无法判断它是否可为null。但从文档中可以清楚地看到,该方法只返回调用它的StringBuilder,因此不能为null。因此,为了安全起见,您可以指定一个显式的StringBuilder类型,即b不可为空。

!表示一个。这意味着编译器无法判断该类型是否可为null,因为它来自Java或其他JVM语言,不区分可为null的类型和不可为null的类型,也没有注释@nullable或@NonNull来表示这一点

因此,编译器将无法进行通常的空检查,因此您应该小心

如果您从文档中知道,或者查看Java代码,或者不管值是否可以为null,那么最好将类型显式指定为带尾随?的可空类型,或者不带尾随?的不可空类型

在这种情况下,区别在于apply返回调用它的值;这就是Kotlin,所以编译器知道它的类型。但是,run返回lambda中的最后一个值,这是最后一个append调用的结果。该方法是在Java中定义的,因为StringBuilder是Java标准库的一部分,所以编译器无法判断它是否可为null。但从文档中可以清楚地看到,该方法只返回调用它的StringBuilder,因此不能为null。因此,为了安全起见,您可以指定一个显式的StringBuilder类型,即b不可为null。

apply将返回调用它的自身。run将返回最后一行的结果,即它将把APPENDER的return语句从me传播到b。由于追加是在Java中定义的,并且没有可空性信息,因此在Kotlin中它被视为JVM平台类型。apply将返回调用它时的自身。run将返回最后一行的结果,即它将把APPENDER的return语句从me传播到b。由于append是在Java中定义的,并且没有可空性信息,因此在Kotlin中它被视为JVM平台类型。