代码之家  ›  专栏  ›  技术社区  ›  Quinn

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

  •  2
  • Quinn  · 技术社区  · 7 年前

    当我有一个可以为空的数组/列表/哈希映射时,例如

    var x: ArrayList<String>? = null
    

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

    var element = x?.get(1)
    

    或者我可以这样做不安全

    var element = x!![1]
    

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

    var element = x?[1]
    

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   zsmb13    7 年前

    在第一个例子中,您使用的是安全呼叫接线员 ?. 打电话给 get 使用它。

    在第二个示例中,您使用的是 [] 运算符的不可为空的返回值 x!! 表达式,这当然是允许的。

    然而,语言根本没有 ?[] 运算符,这是两者的组合。提供的其他运算符也没有空安全变量:没有 ?+ ?&& 或者类似的事情。这只是语言创建者的设计决策。(可用操作员的完整列表为 here )

    如果要使用运算符,则需要在不可为空的表达式上调用它们——只有函数才能获得安全调用运算符的便利性。


    还可以将自己的运算符定义为可为空类型的扩展:

    operator fun <T> List<T>?.get(index: Int) = this?.get(index)
    
    val x: ArrayList<String>? = null
    
    val second = x[2] // null
    

    这将使您获得更整洁的语法,但它隐藏了底层的空处理,并且可能会使不希望在集合上使用此自定义扩展的人感到困惑。