在泛型类中有可空的运算符是否有效?

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 : AnyString? 。 调用x?.toString()也被标记为警告,表示安全调用是不必要的。

Interesting Posts