Kotlin中的单个感叹号

时间:2017-05-07 00:36:28

标签: kotlin

Kotlin中的单个感叹号是什么意思?我已经看过几次,特别是在使用Java API时。但我在文档和StackOverflow中都找不到它。

6 个答案:

答案 0 :(得分:89)

他们被称为platform types,他们的意思是Kotlin不知道该值是否可以null,并且由您来决定它是否可以为空。

  

简而言之,问题是来自Java的任何引用都可能为null,并且Kotlin在设计上是空安全的,会强制用户对每个Java值进行空值检查,或使用安全调用({{1} })或非空断言(?.)。那些在纯Kotlin世界中非常方便的功能,当你必须在Kotlin / Java设置中经常使用它们时,往往会变成一场灾难。

     

这就是我们采用激进方法并使Kotlin的类型系统在Java互操作方面更加轻松的原因:现在来自Java的引用有特别标记的类型 - Kotlin Blog

答案 1 :(得分:39)

这是platform types的符号:

T!表示“TT?

答案 2 :(得分:10)

!标注的类型称为平台类型,它是来自Java 的类型,因此最有可能是null。这是Kotlin编译器在调用Java时默认推断的内容(对于最基本的情况,Java方法可以annotated来解决这个问题)。您应该将平台类型作为 nullable 类型处理,除非您确实知道特定API永远不会返回null。编译器允许将平台类型分配给可空和非空类型的变量。

  

<强> Notation for Platform Types

     

[...]

     

T!表示&#34; T or T?&#34; [...]

您可以将平台类型称为&#34; 未知可空性&#34;的类型。同样重要的是要知道你不能将感叹号类型用于你自己的类型,它不是Kotlin语法的一部分,它只是一个符号

答案 3 :(得分:2)

  

我已经看过几次了,尤其是在使用Java API时

如s1m0nw1所述,T!表示T or T?。下一个问题是:T?是什么?很好地记录在https://kotlinlang.org/docs/reference/null-safety.html中。 Kotlin不允许某些元素为null,例如String,与Java不同

  

要允许为空,我们可以将变量声明为可为空的字符串,写成   字符串?:

var b: String? = "abc"
b = null // ok
     

[...]

b?.length 
     

如果b不为null,则返回b.length,否则返回null。此表达式的类型为Int?

答案 4 :(得分:0)

摘录自Platform Types in Kotlin

  

除了将类型明确指定为可选类型(例如 Person? )外,Kotlin还为我们展示了另一种名为Platform Type的野兽,通过添加单个感叹号(例如, Person! )。当从Java等非空安全平台访问代码时,出于兼容性原因创建了此概念。通常情况下,使用Java库时,许多方法都会返回SomeType!,因为Kotlin编译器无法推断结果是否可为空。

例如:

(Mutable)Collection<T>! 

仅表示以下含义:“ T的Java集合可能是可变的,还是可能为空的 ”。

希望这会有所帮助。

答案 5 :(得分:0)

以单个感叹号!结尾的类型名称或类名称在Kotlin中称为平台类型。当您在Kotlin中使用不包含可空性信息的旧Java代码时,就会找到它们。

例如:

可空信息:可空类型

Kotlin将Java中的

@Nullable String视为String?

非空信息:非空类型

Kotlin将Java中的

@NotNull String视为String

没有信息:平台类型

String在Java中没有注释,被Kotlin视为String!


如何处理平台类型?

您可以使用可为空或非为空的平台类型。编译器将允许您调用此类型的所有方法。如何使用它们是您的责任。如果您知道该值可以为null,则应在将其调用方法之前将其与null进行比较。如果您知道它不为null,则可以直接使用它,但是就像在Java中一样,如果您对可为空性的假设错误,则会出现异常。

请注意,您不能在Kotlin代码中声明平台类型,它们只能来自Java代码。


继承和平台类型

在Kotlin代码中覆盖Java方法时,您可以选择将参数声明为空或非空。您需要明智地选择它,因为如果您决定使参数为非空,那么Kotlin编译器会为这些非空参数生成非空断言。下次当您从Java重新访问此Kotlin代码并传递空值时,您将获得异常。

希望可以帮助您消除对平台类型的所有疑问。