我剛剛在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