Scala Seq [Seq [SomeClass]]类型不匹配,用于可变集合

时间:2018-08-22 19:04:11

标签: scala collections

我遇到了与多个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  
    }
  }
 }

我完全不知道为什么会这样。非常感谢!

2 个答案:

答案 0 :(得分:1)

我可以通过两个小的改动来编译它。

import scala.collection.mutable.{ArrayBuffer, ListBuffer, Seq}
                                                          ^^^

  k1Class.students.update(0, mary)

通常不鼓励人们过于依赖可变性,但是我们都必须从某个地方入手。

答案 1 :(得分:0)

  

如果我使用Seq [Seq [SomeClass]]并为Seq使用可变集合

这里重要的是静态类型。 k1Class.students的类型为Seq[Student],这是默认导入的Seqscala.Predef.Seq,它是scala.collection.Seq的别名。因此它不是可变的,也没有定义+=