我遇到了与多个Seq嵌套和可变集合有关的问题。如果我使用Seq [Seq [SomeClass]]并对Seq使用可变集合,它将在IntelliJ中产生类型为Type mismatch, expected: String, actual: SomeClass
的类型不匹配。如果我运行它,它将抛出
value + =不是Seq [SomeClass]的成员。表达式无法转换为赋值,因为接收者不可赋值。
代码如下。错误发生在k1Class.students += mary
,在代码中已注释。
package core
import scala.collection.mutable
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
case class Student(age: Int, name: String)
case class Class(topic: String, students: Seq[Student])
object Test2 {
def main(args: Array[String]): Unit = {
val grades = mutable.HashMap[String, Seq[Class]]()
val classes = ListBuffer[Class]()
val students = ArrayBuffer[Student]()
val bob = Student(7, "Black")
students += bob
val musicClass = Class("music", students)
classes += musicClass
grades += ("k1" -> classes)
val k1Classes = grades.get("k1").get
for (k1Class <- k1Classes){
val mary = Student(7, "Brown")
//!!! Error here!!! Type mismatch, expected: String, actual: Student
k1Class.students += mary
}
}
}
我完全不知道为什么会这样。非常感谢!
答案 0 :(得分:1)
我可以通过两个小的改动来编译它。
import scala.collection.mutable.{ArrayBuffer, ListBuffer, Seq}
^^^
和
k1Class.students.update(0, mary)
通常不鼓励人们过于依赖可变性,但是我们都必须从某个地方入手。
答案 1 :(得分:0)
如果我使用Seq [Seq [SomeClass]]并为Seq使用可变集合
这里重要的是静态类型。 k1Class.students
的类型为Seq[Student]
,这是默认导入的Seq
:scala.Predef.Seq
,它是scala.collection.Seq
的别名。因此它不是可变的,也没有定义+=
。