如何在 Kotlin 中创建列表?

51

我在 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。能有人解释一下这里发生了什么吗?

5个回答

48

以下是从 Kotlin 集合文档 中的内容:

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

目前在注释之外的代码中没有列表字面值


44
正如@Carcigenicate所指出的,[null, null]没有语法。
然而,Kotlin有一些方便处理列表和数组的方法。

列表

  • listOf()

    创建一个新的只读列表。

  • listOfNotNull()

    与listOf()基本相同,但不包括null值。甚至空字符串也会被跳过。

  • arrayListOf()

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

  • mutableListOf()

    类似于arrayListOf()。实际上,mutableListOf()在内部使用ArrayLists。阅读更多

数组

  • arrayOf()

    这将创建一个数组,它与您了解的大多数语言非常不同。 Kotlin中没有像{1, 2, 3}或[1, 2, 3]这样的语法结构,而是使用函数。 您还可以获得用于类型化数组的函数:

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

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

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

然而,正如此处所讨论的那样,这种情况在未来可能会发生改变。
在处理数组时,了解这些函数创建的返回类型非常重要。 例如: Array<Int> 在底层是一个 Integer[],而当针对 JVM 时,IntArray 是一个原始的 int[]

11

如果要使用可变列表,可以声明一个空的Stringval list: MutableList<String> = mutableListOf()。如果您想要一个不可变的列表,则可以这样使用valval list: List<String> = listOf("x", "y", "z")

此外,请注意,您应该考虑使用val还是var的用例。 列表的可变性涉及列表本身中的值,而valvar用于变量。 如果使用var,可以重新分配列表,但不能使用val(类似于Java的最终值)。

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

不可变列表文档

可变列表文档


1
val和final很相似,都是不可变的,而var是可变的,对吧? - JacksOnF1re
@JacksOnF1re,关于val和var你是对的,我已经更新了它。 - Miniman

2

是的,这不是使用 Kotlin 创建 List 的正确语法。 以下是 ListMutableList(带有写操作)的示例以及您可以对它们执行的一些操作:

List

val numbers = listOf("one", "two", "three", "four")
println("Number of elements: ${numbers.size}")
println("Third element: ${numbers.get(2)}")
println("Fourth element: ${numbers[3]}")
println("Index of element \"two\" ${numbers.indexOf("two")}")

可变列表

val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
numbers.removeAt(1)
numbers[0] = 0
numbers.shuffle()
println(numbers)

2
你得到的是 [null, null],因为在 java.util.AbstractCollection 中定义了 toString() 方法的行为,而 listOf 创建的是一个继承了该实现的 java.util.ArrayList
你遇到错误是因为 Kotlin 中确实存在一处可以使用这种语法的地方: 注解参数。因此解析器能够理解它。但是它创建的是数组而不是列表,因此即使语法没有限制到注解中,你的代码也无法编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接