Kotlin 数组函数 asList() 未解析的引用

时间:2021-06-21 07:29:02

标签: android kotlin

我有一个代码:

fun loadSounds(): List<String> {
    try {
      val soundNames = assets.list(SOUNDS_FOLDER)!!
      Log.d (TAG, "Found ${soundNames.size} sounds")
      return soundNames.asList()
    }
    catch (e: Exception) {
      Log.e(TAG, "Could not list assets", e)
      return emptyList()
    }
  }

我无法编译它,因为错误:

Unresolved reference: asList

如何将数组 (array<(out) string!>) 转换为列表? array<(out) string!> 是什么意思?

更新:我在 asList()、toList() 和 split() 方面有问题,它们是未解析的引用。

3 个答案:

答案 0 :(得分:3)

<块引用>

array<(out) string!> 是什么意思?

这个声明有一堆组件需要解包:

  • Array 是基本原始类型
  • StringArray 的类型参数,这里是数组的元素类型
  • String! 上的感叹号表明它是一个 platform type。这意味着它来自 Java,而 Kotlin 不知道这些字符串的可空性。基本上,它无法告诉您数组是否包含空值。当有这样的疑问时,为了方便起见,Kotlin 不会强迫您检查可空性。
  • 泛型类型参数上的 out 修饰符表明该数组可能包含 String 的子类型,因此理论上您应该无法更新其中的元素(您应该只能获得值“出”数组,并将它们存储在 String 变量中)。 Kotlin 在 (out) 周围加上括号,因为它是从 Java 推断出来的(没有什么是确定的)。所以在实践中你可能不会受到这样的限制,你应该仍然能够将数组分配给类型为 Array<String> 的变量,从而在其中插入内容。

简而言之,Array<(out) String!> 表示“可为空或不可为空的字符串(或字符串的子类型)的 Java 数组”。


现在,我不太精通 Android API,但您调用的 assets.list() 函数似乎是 this one

此方法返回一个可为空的数组 Array<out String!>?,因此您无法在不检查数组本身的可为空性的情况下直接对其调用方法。使用带有 ? 的安全调用或在返回之前检查 null:

return soundNames?.toList() // you have to make your return type nullable in this case

或者:

return soundNames?.toList() ?: error("Null assets array")

编辑

在问题中进行编辑后,似乎现在已经通过 !! 运算符处理了可空性,并且有问题的方法现在是 asList() 而不是 toList()。所以这是一个不同的故事。

答案 1 :(得分:1)

尝试使用以下代码。

fun loadSounds(): List<String>? {
    try {
        val soundNames = assets.list ("")
        Log.d (TAG, "Found ${soundNames?.size} sounds")
        return soundNames?.toList()
    }
    catch (e: Exception) {
        Log.e(TAG, "Could not list assets", e)
        return emptyList()
    }
}

答案 2 :(得分:0)

主要原因不是检查可空性,而是在项目设置中,某些东西被破坏了(可能包括 stdlib 或其他东西)。我复制我的代码并将其粘贴到另一个空项目中,重命名它,现在一切正常。