我刚刚在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()
}
现在甚至不进行编译,因为我们不能String?
实例T : Any
。呼叫x?.toString()
也标有警告,表示安全呼叫是不必要的。
只是键入'T'被解释为'T:Any?',所以没有“只输入'T'”,因为编译器会将其视为可空。您可以使用'T:Any'来定义不可空的不同上限。 – 2016-01-02 03:21:30