我正在使用kotlin开发android应用程序,并且Android Studio自动完成菜单显示了此信息(我正在详细说明服务器响应)
您可以看到message
和status
是两个字符串,但是一个是第一个标记为String!
,另一个是String
,但是我不知道不能得到差异
我尝试签入(java)源代码,并且status
被标记为@NonNull
,而message
没有任何注释,但是如果String可以为null在kotlin中,我应该使用!!
运算符来访问它,并且应该将其标记为?
,而不是!
,因为它的类型为String?
。>
这是怎么回事?
答案 0 :(得分:2)
标有的类型!来自Java,它们被称为platform types
。这意味着Kotlin编译器不知道该值是否可以为null,因为没有找到可为空的注释。
放宽此类检查,以确保安全 它们与Java中的相同
您应该小心使用这些类型,因为它们会导致运行时异常:
当我们在平台类型的变量上调用方法时,Kotlin不会 在编译时发出可空性错误,但调用可能会在以下时间失败 运行时,因为存在空指针异常或断言 Kotlin生成以防止null传播
答案 1 :(得分:1)
除了Sergii的回答外,Kotlin编译器还支持一组注释,从而可以根据问题中的说明推断出正确的类型。完整列表here可用,目前包括以下列表:
@Nullable
和@NotNull
android.support.annotation
下提供的注释如果使用支持的注释之一对Java方法进行注释,那么从Kotlin调用该方法时,您将“免费”获得正确的类型,即String
或String?
为根据您的示例。
如果否则您将无法编辑源代码,但是您知道给定方法永远不会返回null
,则可以通过显式键入变量来“强制”所需的类型(如{{3 }})。示例:
val url: String = result.checkpoint_url
通过这种方式,您的url
变量将不再是String!
,但将被强制为String
。同样,您可以对val url: String? = xxx
执行相同的操作。
不过请注意,尽管后者永远不会失败(因为它可以同时包含可为空和不可为空的字符串),但是如果result.checkpoint_url
实际上为 {{1} },在这种情况下,将引发运行时异常。