Kotlin中 val 声明的ArrayList报错:真正的幕后黑手是它!
2023-11-28 03:08:38
在Kotlin中,我们经常使用val和var来分别声明不可变和可变变量。对于可变变量,可以使用ArrayList等可变集合类来存储和管理数据。然而,最近有开发者遇到了一个奇怪的错误,在使用ArrayList时报出了"val list: ArrayList
乍一看,这似乎是一个简单的语法错误,但事实并非如此。要想理解这个错误的根源,我们需要深入了解Kotlin中的类型系统。
Kotlin采用了一种称为"类型推断"的机制,它可以自动推断变量的类型。这意味着在声明变量时,通常不需要显式指定类型。在上面的示例中,编译器将list推断为ArrayList
但是,当使用val关键字时,变量被声明为不可变的,这意味着它的值在初始化后不能再改变。而ArrayList是一个可变集合类,它的内容可以通过add()、remove()等方法进行修改。因此,编译器会报告一个错误,指出无法将可变集合类分配给不可变变量。
解决此问题的正确方法是使用mutableListOf()函数来创建可变列表:
val list: MutableList<String> = mutableListOf()
mutableListOf()函数返回一个可变列表,它可以与val关键字一起使用。
错误背后的真正原因
其实,导致这个错误的真正原因是Kotlin中协变和逆变的概念。协变和逆变是一种类型系统特性,它了子类型和父类型之间的关系。
在Kotlin中,ArrayList
在上面的示例中,编译器期望list是不可变的ArrayList
总结
当在Kotlin中使用val关键字声明可变集合类时,应使用mutableListOf()函数来创建可变列表。理解Kotlin中的协变和逆变概念有助于我们更好地理解此类错误的根源。