Kotlin具有处理可空类型的漂亮功能(?.
和!!.
)。但是这个只是让我感到震惊 - 如果你不知道你是否正在处理可空或不可空类型?如果你有普通类MyClass<T>
怎么办,那么你只需要一些类型T
就可以了。
Kotlin是否允许&#34; nullable&#34;运算符应用于泛型类型(T
此处),类型是否可以为在类中(如T?
),如果类将以可空类型实例化,该怎么办 - - 比如MyClass<String?>
。它是否会导致可以为空的可空(如指向C ++中的指针的指针 - **std::string
)类型在MyClass
类型中?
答案 0 :(得分:5)
我刚刚在Web Demo尝试了它。
class MyClass<T>(val x: T) {
fun foo() {
println(x.toString())
}
fun fooSave() {
println(x?.toString())
}
}
fun main(args: Array<String>) {
MyClass<String?>(null).fooSave()
MyClass<String?>(null).foo()
}
似乎你总是可以应用null-safe operator ?.
,即使该类型不一定是可空的。
另一方面,您可以将泛型类型参数T
绑定到可以为空的类型,在我的情况下为String?
,,如果通过{{1>,实际上会产生NullPointerException }} 击>
编辑:自从提出问题以来,没有上限的泛型类型的语义已经改变。 null
现在被解释为T
。但是上面的代码不再崩溃了。原因是调用T : Any?
将调用正确处理x.toString()
的扩展函数Any?.toString()
。
如果我们更改代码如下
null
它现在甚至无法编译,因为我们无法使用class MyClass<T : Any>(val x: T) {
fun foo() {
println(x.toString())
}
fun fooSave() {
println(x?.toString())
}
}
fun main(args: Array<String>) {
MyClass<String?>(null).fooSave()
MyClass<String?>(null).foo()
}
实例化T : Any
。呼叫String?
也会被标记为警告,表示安全呼叫是不必要的。