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

标签 scala compiler-errors type-mismatch

我试图将可变对象与scala中的不可变映射连接起来。

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更改为“测试”时,编译器说:
type mismatch;  found   : java.io.Serializable  required: String

我很困惑我会错误地使用getOrElse吗?

问候
西里尔

最佳答案

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

map 上的 map 会传递 map 的每个元素。所以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的相当普遍的问题,编译器希望在不应该的地方使用String。

无论如何,
(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)))

关于scala - 使用getOrElse连接两个映射时,类型不匹配编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947664/

相关文章:

C - 取消引用指向不完整类型的指针

java - 可以找到错误

apache-flex - 类mx.core::DesignLayer could not be found

c# - 在 Rx 和 LINQ(或者一般来说,流和列表)之间共享查询

scala - Scala 中的闭包

scala - 尝试为 ADT 编写 Circe 编码器或解码器时遇到错误

java - CustomList<T extends A> 类型不匹配

json - 我使用Scalaj请求时出现SocketTimeoutException

c++ - C++ 中的 std::complex<double> 与具有链接时优化的 gcc 6 下 Fortran 中的 complex*16 之间的类型不匹配

rust - 错误 : type mismatch: expected `usize` , 发现 `i64` 与 `Vec<i64>`