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!”。
两者有什么区别? StringBuilderStringBuilder!有什么区别?谢谢 :)
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