我在KotlinREPL试过这些
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]
^
我是新来的,谁能解释一下这是怎么回事?
5条答案
按热度按时间myss37ts1#
来自Kotlindocumentation on Collections:
Kotlin没有专门的语法结构来创建列表或集合。请使用标准库中的方法,如listOf()、mutableListOf()、setOf()、mutableSetOf()。
注解之外的代码没有列表文字currently。
dauxcl2d2#
正如@Carcigenicate所指出的,
[null, null]
没有语法。但是,Kotlin确实有一些处理列表和数组的方便方法。
列表
创建新的只读列表。
基本上与listOf()相同,但没有空值。即使是空字符串也会被跳过。
创建一个ArrayList。这次您可以修改(添加/删除)元素。
行为类似于arrayListOf()。实际上,mutableListOf()在内部使用ArrayLists.Read more
数组
这就创建了一个数组,这与你所知道的大多数语言都有很大的不同。Kotlin中有函数,而不是像{1,2,3}或[1,2,3]这样的语法结构。你还可以得到类型数组的函数:
注解是一个例外,它解释了编译器错误
[Collection literals outside of annotations]
:但是,如here所述,将来可能会发生变化。
在使用数组时,了解这些函数创建的返回类型是很重要的。例如:
Array<Int>
是一个Integer[]
,而IntArray
在面向JVM时是一个基本的int[]
。7xllpg7q3#
所以对于可变列表的情况,你可以声明一个空的
String
列表:val list: MutableList<String> = mutableListOf()
。如果你想要一个不可变的列表,那么你可以这样使用val
:val list: List<String> = listOf("x", "y", "z")
.另请注意,您应该考虑使用
val
或var
的用例。列表的可变性与列表本身的值有关,其中val
和var
是变量。如果您使用var
而不是val
,则可以重新分配列表(类似于Java的final)为了清楚起见,作为一个例子,可变列表可以在初始化后添加和删除元素,而不可变列表不能。
Immutable Lists Docs
Mutable List Docs
3htmauhk4#
你会得到
[null, null]
,因为toString()
恰好是这样定义在java.util.AbstractCollection
中的,listOf
创建了一个继承了这个实现的java.util.ArrayList
。您得到的错误是因为在Kotlin中有 is 一个地方恰好可以使用此语法:注解参数,所以解析器理解它,但是它创建数组,而不是列表,所以即使语法不限于注解,代码也不会编译。
nkoocmlb5#
是的,这不是用Kotlin创建
List
的正确语法。下面是List
和MutableList
的一个例子(带有写操作),以及你可以对它们进行的一些操作:列表
可变列表