在下面的代码中。我在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)
}发布于 2020-10-10 16:43:22
!表示platform type。这意味着编译器无法判断类型是否为空,因为它来自Java语言(或其他JVM语言),它没有区分可空类型和不可空类型,也没有注释(@Nullable或@NonNull)来表示这一点。
因此,编译器将不能进行通常的null检查,因此您应该小心。
如果您(通过文档或查看Java代码等)知道值是否可以为null,最好显式指定类型(可以使用尾随的?指定为空,也可以不指定为非空)。
在本例中,不同之处在于apply()返回它被调用的值;这就是所有的Kotlin,所以编译器知道它的类型。但是,run()返回lambda中的最后一个值,这是最后一次append()调用的结果。该方法是在Java语言中定义的(因为StringBuilder是Java标准库的一部分),所以编译器无法判断它是否可以为空。但从文档中可以清楚地看出,该方法只返回被调用的StringBuilder,因此不能为空。因此,为了安全起见,您可以为b指定一个显式的StringBuilder类型(即非空值)。
https://stackoverflow.com/questions/64291316
复制相似问题