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