当我有一个可为空的数组/列表/哈希图,例如
var x: ArrayList<String>? = null
我知道可以像这样访问索引1的元素
var element = x?.get(1)
否则我可能会以不安全的方式这样做
var element = x!![1]
但是我为什么不能做这样的事情
var element = x?[1]
使用第一个示例和最后一个示例从数组中获取元素之间有什么区别,为什么不允许最后一个示例?
答案 0 :(得分:3)
在第一个示例中,您使用安全调用运算符?.
来调用get
函数。
在第二个示例中,您在[]
表达式的非空返回值上使用了x!!
运算符,这当然是允许的。
但是,该语言根本没有?[]
运算符,它是两者的组合。所提供的其他运算符也没有null安全变体:没有?+
或?&&
或类似的东西。这只是语言创建者的设计决定。 (可用运算符的完整列表为here)。
如果要使用运算符,则需要在不可为null的表达式上调用它们-只有函数才能安全调用运算符。
您还可以将自己的运算符定义为可为null的类型的扩展名:
operator fun <T> List<T>?.get(index: Int) = this?.get(index)
val x: ArrayList<String>? = null
val second = x[2] // null
这会使您语法更整洁,但是会隐藏底层的null处理,并且可能会使不希望在集合中使用此自定义扩展名的人感到困惑。