Kotlin中的单个感叹号是什么意思?我已经看过几次,特别是在使用Java API时。但我在文档和StackOverflow中都找不到它。
答案 0 :(得分:89)
他们被称为platform types,他们的意思是Kotlin不知道该值是否可以null
,并且由您来决定它是否可以为空。
简而言之,问题是来自Java的任何引用都可能为null,并且Kotlin在设计上是空安全的,会强制用户对每个Java值进行空值检查,或使用安全调用({{1} })或非空断言(
?.
)。那些在纯Kotlin世界中非常方便的功能,当你必须在Kotlin / Java设置中经常使用它们时,往往会变成一场灾难。这就是我们采用激进方法并使Kotlin的类型系统在Java互操作方面更加轻松的原因:现在来自Java的引用有特别标记的类型 - Kotlin Blog
答案 1 :(得分:39)
这是platform types的符号:
T!
表示“T
或T?
”
答案 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)
除了将类型明确指定为可选类型(例如
Person?
)外,Kotlin还为我们展示了另一种名为Platform Type
的野兽,通过添加单个感叹号(例如,Person!
)。当从Java等非空安全平台访问代码时,出于兼容性原因创建了此概念。通常情况下,使用Java库时,许多方法都会返回SomeType!
,因为Kotlin编译器无法推断结果是否可为空。
例如:
(Mutable)Collection<T>!
仅表示以下含义:“ T的Java集合可能是可变的,还是可能为空的 ”。
希望这会有所帮助。
答案 5 :(得分:0)
以单个感叹号!
结尾的类型名称或类名称在Kotlin中称为平台类型。当您在Kotlin中使用不包含可空性信息的旧Java代码时,就会找到它们。
例如:
@Nullable String
视为String?
。
@NotNull String
视为String
。
String
在Java中没有注释,被Kotlin视为String!
。
您可以使用可为空或非为空的平台类型。编译器将允许您调用此类型的所有方法。如何使用它们是您的责任。如果您知道该值可以为null,则应在将其调用方法之前将其与null进行比较。如果您知道它不为null,则可以直接使用它,但是就像在Java中一样,如果您对可为空性的假设错误,则会出现异常。
请注意,您不能在Kotlin代码中声明平台类型,它们只能来自Java代码。
在Kotlin代码中覆盖Java方法时,您可以选择将参数声明为空或非空。您需要明智地选择它,因为如果您决定使参数为非空,那么Kotlin编译器会为这些非空参数生成非空断言。下次当您从Java重新访问此Kotlin代码并传递空值时,您将获得异常。
希望可以帮助您消除对平台类型的所有疑问。