考虑一下
scala> val m = Map('a -> 3, 'b -> 4)
m: scala.collection.immutable.Map[Symbol,Int] = Map('a -> 3, 'b -> 4)
scala> val d: Double = m.getOrElse('c, 0)
<console>:8: error: type mismatch;
found : AnyVal
required: Double
val d: Double = m.getOrElse('c, 0)
^
scala> m.getOrElse('c, 0)
res0: Int = 0
scala> m.getOrElse('a, 0)
res1: Int = 3为什么Scala认为getOrElse调用返回AnyVal,即使它显然返回Int
此外,即使这样做也会出现同样的错误:
scala> val x: Double = m.getOrElse('a, 0): Double
<console>:8: error: type mismatch;
found : AnyVal
required: Double
val x: Double = m.getOrElse('a, 0): Double然而,这样做是可行的:
scala> val x: Double = m.getOrElse('a, 0): Int
x: Double = 3.0这种情况发生在2.11.x上,我没有在2.10.x上尝试过。
发布于 2014-09-17 18:34:04
因为map在其第二类参数中是协变的,所以我们需要使用特殊的技巧来避免反方差问题,即为这种类型指定一个上限:
def getOrElse[B1 >: B](key: A, default: => B1): B1因为您显式地提供返回类型为Double,所以scalac将其常见的超级类型解析为AnyVal,因为Int和Double是AnyVal的子类型。在第二个例子中,scalac看到了类型归属,因此它正确地推断了B1,然后将Int转换为Double。
https://stackoverflow.com/questions/25897784
复制相似问题