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


当前回答

摘自Kotlin中的平台类型:

除了显式地指定一个可选类型(例如Person?), Kotlin还向我们展示了另一个野兽,称为平台类型,通过放置一个感叹号来指定(例如Person!)创建这个概念是出于兼容性的考虑,当从Java这样的空不安全平台访问代码时。在使用Java库时,很多方法都返回SomeType!,因为Kotlin编译器不能推断结果是否为空。

例如:

(Mutable)Collection<T>! 

只是意味着:“Java集合的T可能是可变的,也可能不是空的”。

希望这能有所帮助。

其他回答

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

平台类型符号 […] T !意思是“T还是T?”[…]

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

平台类型

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

例子:

Nullable信息:Nullable类型

@Nullable字符串在Java中被认为是字符串?芬兰湾的科特林。

Non-null Information:非空类型

Java中的@NotNull字符串被Kotlin视为字符串。

无信息:平台类型

Java中没有注释的字符串被认为是String!芬兰湾的科特林。


如何处理平台类型?

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

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


继承和平台类型

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

希望这有助于消除你对平台类型的所有疑虑。

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

In a nutshell, the problem is that any reference coming from Java may be null, and Kotlin, being null-safe by design, forced the user to null-check every Java value, or use safe calls (?.) or not-null assertions (!!). Those being very handy features in the pure Kotlin world, tend to turn into a disaster when you have to use them too often in the Kotlin/Java setting. This is why we took a radical approach and made Kotlin’s type system more relaxed when it comes to Java interop: now references coming from Java have specially marked types -- Kotlin Blog

它是平台类型的符号:

T !意思是“T还是T?”

摘自Kotlin中的平台类型:

除了显式地指定一个可选类型(例如Person?), Kotlin还向我们展示了另一个野兽,称为平台类型,通过放置一个感叹号来指定(例如Person!)创建这个概念是出于兼容性的考虑,当从Java这样的空不安全平台访问代码时。在使用Java库时,很多方法都返回SomeType!,因为Kotlin编译器不能推断结果是否为空。

例如:

(Mutable)Collection<T>! 

只是意味着:“Java集合的T可能是可变的,也可能不是空的”。

希望这能有所帮助。