可空操作符在泛型类中是否有效?

时间:2015-01-31 17:57:01

标签: generics nullable kotlin

Kotlin具有处理可空类型的漂亮功能(?.!!.)。但是这个只是让我感到震惊 - 如果你不知道你是否正在处理可空或不可空类型?如果你有普通类MyClass<T>怎么办,那么你只需要一些类型T就可以了。

Kotlin是否允许&#34; nullable&#34;运算符应用于泛型类型(T此处),类型是否可以为类中(如T?),如果类将以可空类型实例化,该怎么办 - - 比如MyClass<String?>。它是否会导致可以为空的可空(如指向C ++中的指针的指针 - **std::string)类型在MyClass类型中?

1 个答案:

答案 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?也会被标记为警告,表示安全呼叫是不必要的。