【问题标题】:How to create list in Kotlin?如何在 Kotlin 中创建列表?
【发布时间】:2018-05-13 17:46:43
【问题描述】:

我在 Kotlin REPL 中尝试过这些

var listA = listOf(null ,null)
var listB = [null, null]

第一行按预期工作正常。在显示 listA 时,我得到:

[null, null]

第二行抛出如下错误:

error: cannot use 'Nothing?' as reified type parameter
var listB = [null,null]
            ^
error: unsupported [Collection literals outside of annotations]
var listB = [null,null]
            ^
error: unsupported [Array<Nothing> in return type is illegal]
var listB = [null,null]
            ^

当我尝试对非空类型进行相同操作时, 即

var listC = [1,2]

我收到此错误:

error: unsupported [Collection literals outside of annotations]
var listC = [1,2]
            ^

我是 Kotlin 的新手。有人可以解释一下这里发生了什么吗?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    来自 Kotlin documentation on Collections

    Kotlin 没有用于创建列表或集合的专用语法结构。使用标准库中的方法,例如 listOf()、mutableListOf()、setOf()、mutableSetOf()。

    注释之外的代码没有列表文字currently

    【讨论】:

      【解决方案2】:

      正如@Carcigenicate 指出的那样,[null, null] 没有语法。
      不过,Kotlin 确实有一些方便的方法来处理列表和数组。

      列表

      • listOf()

        创建一个新的只读列表。

      • listOfNotNull()

        与 listOf() 基本相同,但没有 null 值。即使是空字符串 被跳过。

      • arrayListOf()

        创建一个 ArrayList。这次您可以修改(添加/删除)元素。

      • mutableListOf()

        行为类似于 arrayListOf()。实际上,mutableListOf() 内部使用了 ArrayLists。 Read more

      数组

      • arrayOf()

        这将创建一个数组,这与您所知道的大多数语言非常不同。 而不是像 {1, 2, 3} 或 [1, 2, 3] 这样的语法结构,你有函数 在科特林。您还可以获得类型化数组的函数:

        • booleanArrayOf()
        • doubleArrayOf()
        • charArrayOf()
        • ...

      注释是一个例外,它解释了您的编译器错误[Collection literals outside of annotations]

      @MyAnnotation(arguments = [1, 2, 3])
      

      但是,正如 here 所讨论的那样,这在未来可能会发生变化。


      在使用数组时,了解这些函数正在创建的返回类型很重要。 举个例子: Array&lt;Int&gt; 是底层的 Integer[],而IntArray 是针对 JVM 的原始 int[]

      【讨论】:

        【解决方案3】:

        因此,对于可变列表的情况,您可以声明一个空的Stringval list: MutableList&lt;String&gt; = mutableListOf()。如果你想要一个不可变的列表,那么你可以像这样使用valval list: List&lt;String&gt; = listOf("x", "y", "z")

        另请注意,您应该考虑使用valvar 的用例。列表的可变性与列表本身的值有关,其中valvar 用于变量。如果你使用var而不是val,你可以重新分配列表(类似于Java的final)

        为了清楚起见,例如,可变列表可以在初始化后添加和删除元素,而不可变列表不能。

        Immutable Lists Docs

        Mutable List Docs

        【讨论】:

        • val 不是和 final 类似且不可变,而 var 是吗?
        • @JacksOnF1re 是的,关于 val vs var,你是对的,我更新了它。
        【解决方案4】:

        您会得到[null, null],因为that's how toString() happens to be defined in java.util.AbstractCollectionlistOf 创建了一个继承此实现的java.util.ArrayList

        您得到的错误是因为 在 Kotlin 中有一个地方恰好可以使用这种语法:annotation parameters。所以解析器理解它。但它创建的是数组,而不是列表,因此即使语法不限于注释,您的代码也不会编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 2019-10-24
          • 1970-01-01
          • 1970-01-01
          • 2021-04-20
          • 1970-01-01
          • 2021-09-04
          相关资源
          最近更新 更多