使用getOrElse连接两个映射时类型不匹配编译器错误

时间:2014-11-15 15:55:35

标签: scala compiler-errors type-mismatch

我试图在scala中将mutable与不可变映射连接起来。

case class Result(val key: String, val number: Int)

object Test extends App {

  val map1 = scala.collection.mutable.Map[String, List[Result]]()
  val map2: Map[String, List[Result]] = Map("test" -> List(new Result("0", 0)))

  map1 ++= map2.map(c => (c -> (c._2 + map1.getOrElse(c._1, List[Result]()))))

}

但编译器总是说:

type mismatch;  found   : List[Result]  required: String

当我将ListResult更改为" test"编译说:

type mismatch;  found   : java.io.Serializable  required: String

我很困惑。我是否以错误的方式使用getOrElse?

问候 Cyrill

1 个答案:

答案 0 :(得分:1)

map1 ++= map2.map(c => (c -> (c._2 + map1.getOrElse(c._1, List[Result]()))))

地图上的地图会传递地图的每个元素。所以c是(String, List[Result])。所以这个

(c -> (c._2 + map1.getOrElse(c._1, List[Result]()))

是((String,List [Result],(List [Result])。哪个错了。我想你的意思

(c._1 -> (c._2 + map1.getOrElse(c._1, List[Result]()))

但仍然存在类型不匹配。我认为你正在遇到隐含的Any2String for +的相当普遍的问题,并且编译器需要一个它不应该的字符串。

无论如何,

(c._1 -> (c._2 ++ map1.getOrElse(c._1, List[Result]()))

似乎有用

map1 ++= map2.map(c => (c._1 -> (c._2 ++ map1.getOrElse(c._1, List[Result]()))))

另外,Nil有点整洁:

map1 ++= map2.map(c => (c._1 -> (c._2 ++ map1.getOrElse(c._1, Nil))))

再次更清楚(IMO)是理解

for ((k,v) <-map2) map1 += (k-> (v ++ map1.getOrElse(k, Nil)))