我在Kotlin REPL中尝试了这些
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]
^
第一行按预期正常工作。在显示listA时,我得到:
var listC = [1,2]
第二行引发以下错误:
error: unsupported [Collection literals outside of annotations]
var listC = [1,2]
^
当我尝试使用非null类型时, 即。
.hide {
display:none;
}
我收到此错误:
<div class="row hide">...</div>
我是Kotlin的新手。有人可以解释一下这里发生了什么吗?
答案 0 :(得分:8)
来自Kotlin documentation on Collections:
Kotlin没有专门的语法结构来创建列表或集合。使用标准库中的方法,例如listOf(),mutableListOf(),setOf(),mutableSetOf()。
注释之外的代码没有列表文字currently。
答案 1 :(得分:8)
正如@Carcigenicate所指出的那样,[null, null]
没有语法
但是,Kotlin确实有一些方便的方法来处理列表和数组。
listOf()
创建一个新的只读列表。
listOfNotNull()
基本上与listOf()相同,但没有空值。即使是空字符串 被跳过了。
arrayListOf()
创建一个ArrayList。这次你可以修改(添加/删除)元素。
mutableListOf()
表现得像arrayListOf()。实际上,mutableListOf()在内部使用ArrayLists。 Read more
这会创建一个数组,这与您所知道的大多数语言非常不同。 而不是像{1,2,3}或[1,2,3]这样的语法结构,你有功能 在Kotlin。您还可以获得类型化数组的函数:
- booleanArrayOf()
- doubleArrayOf()
- charArrayOf()
- ...
一个例外是注释,它解释了编译器错误[Collection literals outside of annotations]
:
@MyAnnotation(arguments = [1, 2, 3])
然而,正如所讨论的here,这可能会在未来发生变化。
<小时/> 在使用数组时,了解这些函数正在创建的返回类型非常重要。 举个例子:Array<Int>
是一个Integer[]
,而IntArray
在定位JVM时是一个原始int[]
。
答案 2 :(得分:2)
您得到[null, null]
,因为that's how toString()
happens to be defined in java.util.AbstractCollection
和listOf
创建了一个继承此实现的java.util.ArrayList
。
你得到的错误是因为 在Kotlin中的一个地方,这个语法恰好起作用:annotation parameters。所以解析器理解它。但它创建了数组,而不是列表,因此即使语法不限于注释,您的代码也无法编译。
答案 3 :(得分:0)
因此对于可变列表,您可以使用String
声明一个空的val list: MutableList<String> = mutableListOf()
。请注意,将val
声明用作var
与Java中的final
相似。如果您想要一个不可变的列表,则可以像这样使用val
:val list: List<String> = listOf("x", "y", "z")
为清楚起见,例如,可变列表可以在元素初始化后添加删除的元素,而不可变元素则不能。