Kotlin中的单个感叹号


141

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

Answers:


155

它们被称为平台类型,它们意味着Kotlin不知道该值可以还是不能null,并且由您决定该值是否可为空。

简而言之,问题在于来自Java的任何引用都可能为null,而Kotlin在设计上为null安全,迫使用户对每个Java值进行null检查,或者使用安全调用(?.)或非null断言(!!)。在纯Kotlin世界中,那些非常方便的功能会在您不得不在Kotlin / Java设置中过于频繁地使用它们时变成灾难。

这就是为什么我们在Java互操作时采用了激进的方法并使Kotlin的类型系统更加宽松:现在来自Java的引用具有经过特殊标记的类型-Kotlin Blog


2
多数民众赞成在说和做。但是,我只是感觉不太好platform types
JaydeepW

61

这是平台类型的符号:

T!表示“ TT?


为什么不说TT!T?
Arst

T!表示不可为空,T?表示可为空。为什么Kotlin不能这样做……
Arst,

4
因为显而易见的原因,最好的默认值是“不可为空”,所以最好将默认值设为最短的类型签名。这样T就变成了“不可为空”,其余的则或多或少是武断的
voddan

13

用符号标记的类型!称为平台类型,这是一种来自Java的类型,因此很可能是null。这是Kotlin编译器在调用Java时默认推断的内容(在大多数基本情况下,可以对Java方法进行注释以解决此问题)。您应该将平台类型视为可空类型,除非您肯定知道特定的API将永远不会返回null。编译器允许将平台类型分配给可空和非空类型的变量。

平台类型的表示法

[...]

T!意思是“ T or T?” [...]

您可以将平台类型称为“ 未知可空性类型”。同样重要的是要知道,您不能为自己的类型使用带有感叹号的类型,它不是Kotlin语法的一部分,而只是一个符号


“很可能”这样的短语无济于事
Ewan

9

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

例如:

可空信息:可空类型

@Nullable StringJava中String?的Kotlin 认为。

非空信息:非空类型

@NotNull StringJava中String的Kotlin 认为。

没有信息:平台类型

StringJava中没有注释String!的人将Kotlin 视为。


如何处理平台类型?

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

请注意,您无法在Kotlin代码中声明平台类型,它们仅来自Java代码。


继承和平台类型

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

希望这有助于清除您对平台类型的所有疑问。


3

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

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

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

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

[...]

b?.length 

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


0

摘录自Kotlin的平台类型

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

例如:

(Mutable)Collection<T>! 

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

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.