首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder和StringBuilder有多大的不同!在kotlin?

问StringBuilder和StringBuilder有多大的不同!在kotlin?
EN

Stack Overflow用户
提问于 2020-10-10 16:06:43
回答 1查看 97关注 0票数 1

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

两者之间的区别是什么?StringBuilder和StringBuilder!有什么不同?谢谢您:)

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

发布于 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类型(即非空值)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64291316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档