在泛型类中有可空的运算符是否有效?
Kotlin有漂亮的功能( ?.
和!!.
)处理可空类型。 但是这个只是描述了我 – 如果你不知道你是在处理可为空还是不可空的类型呢? 如果你有泛型类MyClass<T>
,那么你只是有一些类型T
,就是这样。
Kotlin是否允许将“空”运算符应用于泛型类型(这里是T
),该类型是否可以在类(如T?
)中是可空的以及如果类将使用可空类型实例化 – 如MyClass<String?>
。 在MyClass
类型中是否会导致可为空(如C ++中指针指针 – 类型为**std::string
)?
我只是在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() }
看来你总是可以应用无效的运算符?.
即使类型不一定是可空的。
另一方面,你可以将泛型类型参数T
绑定到一个可为空的类型,在我的情况下, String?
, 如果你传递 。 null
,实际上会产生一个NullPointerException
编辑 :由于问题被问到,没有上限的泛型类型的语义已经改变。 T
现在解释为T : Any?
。 但是,上面的代码不会崩溃了。 原因是调用x.toString()
会调用正确处理null
的扩展函数Any?.toString()
。
如果我们更改代码如下
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?
。 调用x?.toString()
也被标记为警告,表示安全调用是不必要的。