This question already has answers here:
Single exclamation mark in Kotlin
(6个答案)
Example of when should we use run, let, apply, also and with on Kotlin
(5个答案)
20天前关闭。
在下面的代码中。我在Intellij Idea编译器中发现,默认情况下val a和val b是“val a:StringBuilder”和“val b:StringBuilder!”。
两者有什么区别?
(6个答案)
Example of when should we use run, let, apply, also and with on Kotlin
(5个答案)
20天前关闭。
在下面的代码中。我在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)
}
最佳答案
!
表示platform type。这意味着编译器无法判断类型是否可为空,因为它来自Java(或另一种JVM语言),它无法区分可空和非可空类型,并且没有注释(@Nullable
或@NonNull
)来表明这一点。
结果,编译器将无法进行其通常的空检查,因此您应该注意。
如果您知道(从文档或查看Java代码,等等)值是否可以为null,则最好明确指定类型(可以为空,后跟?
,不可以为空,不带apply()
) )。
在这种情况下,不同之处在于run()
返回它被调用的值;仅此而已,因此编译器知道其类型。但是,append()
返回lambda中的最后一个值,这是最后一个StringBuilder
调用的结果。该方法是用Java定义的(因为StringBuilder
是Java标准库的一部分),因此编译器无法确定它是否可为空。但是从文档中可以清楚地看到,该方法仅返回调用了它的StringBuilder,因此不能为null。因此,为了安全起见,您可以为b
指定一个显式的ojit_code类型(即,不可为空)。
关于kotlin - 有什么不同的StringBuilder和StringBuilder!在 Kotlin ? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64291316/
10-13 23:12