val map1: Map[Int, Double] = ...
map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) }
[ERROR] ...<code location>...: error: overloaded method value + with alternatives:
[ERROR] (x: Double)Double <and>
[ERROR] (x: Float)Double <and>
[ERROR] (x: Long)Double <and>
[ERROR] (x: Int)Double <and>
[ERROR] (x: Char)Double <and>
[ERROR] (x: Short)Double <and>
[ERROR] (x: Byte)Double <and>
[ERROR] (x: String)String
[ERROR] cannot be applied to (AnyVal)
[ERROR] .map{ case (k, v: Double) => k -> (v + map1.getOrElse(k, 0)) }
[ERROR] ^
在该+
的一侧,有v: Double
;另一方面,Map[Int, Double]
中有一个getOrElse。此添加项必须为Double + Double
。这个错误是从哪里来的?
答案 0 :(得分:1)
这应该可以解决问题:
map1.getOrElse(k,0:Double) or map1.getOrElse(k,0d)
map1.getOrElse(k,0)将返回Any
类型,因为此处将0
视为Integer:
scala> map1.getOrElse(1,0)
res11: AnyVal = 2.0
答案 1 :(得分:1)
让我们说
ReadLine
现在使用
val map1 = Map(1->2.0,2->3.0,3->4.0,4->5.0,5->6.0)
val map2 = Map(1->2.5,3->1.0,4->3.2,7->3.0,6->1.23)
代替
map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0.0)) }
您用map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) }
Int
代替0
Double
。这就是为什么将0.0
方法返回的type
推断为getOrElse
的原因。未将运算符AnyVal
定义为重载为+
。当两者均为Double + AnyVal
时,将按预期正确推断,因为Double
在+
上已定义。 Double
方法返回与提供的特定getOrElse
value
关联的Double
(key
),如果未找到该特定k(Int)
,则应返回仅适用于k
,即在这种情况下为Double
,否则它将返回0.0
或AnyVal
,具体取决于我们提供的Any
或{{1 }}作为Int
函数的第二个参数。
在Scala REPL中:
String