为什么不能使用[]访问可为空的数组/哈希图

时间:2018-08-07 17:40:24

标签: syntax kotlin

当我有一个可为空的数组/列表/哈希图,例如

var x: ArrayList<String>? = null

我知道可以像这样访问索引1的元素

var element = x?.get(1)

否则我可能会以不安全的方式这样做

var element = x!![1]

但是我为什么不能做这样的事情

var element = x?[1]

使用第一个示例和最后一个示例从数组中获取元素之间有什么区别,为什么不允许最后一个示例?

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处理,并且可能会使不希望在集合中使用此自定义扩展名的人感到困惑。