字符串之间的区别!和Kotlin中的String

时间:2018-07-26 14:02:19

标签: java android kotlin null

我正在使用kotlin开发android应用程序,并且Android Studio自动完成菜单显示了此信息(我正在详细说明服务器响应)

enter image description here

您可以看到messagestatus是两个字符串,但是一个是第一个标记为String!,另一个是String,但是我不知道不能得到差异

我尝试签入(java)源代码,并且status被标记为@NonNull,而message没有任何注释,但是如果String可以为null在kotlin中,我应该使用!!运算符来访问它,并且应该将其标记为?,而不是!,因为它的类型为String?

这是怎么回事?

2 个答案:

答案 0 :(得分:2)

标有的类型!来自Java,它们被称为platform types。这意味着Kotlin编译器不知道该值是否可以为null,因为没有找到可为空的注释。

official documentation:

  

放宽此类检查,以确保安全   它们与Java中的相同

您应该小心使用这些类型,因为它们会导致运行时异常:

  

当我们在平台类型的变量上调用方法时,Kotlin不会   在编译时发出可空性错误,但调用可能会在以下时间失败   运行时,因为存在空指针异常或断言   Kotlin生成以防止null传播

答案 1 :(得分:1)

除了Sergii的回答外,Kotlin编译器还支持一组注释,从而可以根据问题中的说明推断出正确的类型。完整列表here可用,目前包括以下列表:

  • JetBrains的@Nullable@NotNull
  • Android在软件包android.support.annotation下提供的注释

如果使用支持的注释之一对Java方法进行注释,那么从Kotlin调用该方法时,您将“免费”获得正确的类型,即StringString?为根据您的示例。

如果否则您将无法编辑源代码,但是您知道给定方法永远不会返回null,则可以通过显式键入变量来“强制”所需的类型(如{{3 }})。示例:

val url: String = result.checkpoint_url

通过这种方式,您的url变量将不再是String!,但将被强制为String。同样,您可以对val url: String? = xxx执行相同的操作。 不过请注意,尽管后者永远不会失败(因为它可以同时包含可为空和不可为空的字符串),但是如果result.checkpoint_url 实际上为 {{1} },在这种情况下,将引发运行时异常。