斯卡拉:为什么AnyVal出现在这里?

时间:2014-09-01 16:28:45

标签: scala map scala-collections

以下是代码:

val m=scala.collection.mutable.HashMap[String, Long]()
var i=m.get("foo")
i=i+i

这是错误:

Error:(28, 9) type mismatch;
 found   : AnyVal
 required: String
    i=i+i
        ^

为什么i突然变成AnyVal?为什么此处需要String,而我的地图中的值为Long

非常感谢

2 个答案:

答案 0 :(得分:6)

你在REPL中试过这个吗?

scala> val m=scala.collection.mutable.HashMap[String, Long]()
m: scala.collection.mutable.HashMap[String,Long] = Map()

scala> var i=m.get("foo")
i: Option[Long] = None

i <{1}},Long <{1}},因为Option[Long]可能不是foo中的关键字

如果我不得不猜测为什么它需要HashMap,那么scala编译器会尝试隐式转换String Option[Long]以便使用{{ 1}}方法。

如果你真的想加倍toString,那么你需要+ i

map

在这种情况下仍然是Option

答案 1 :(得分:2)

get上的Map[A,B]方法返回Option[B]。如果有条目,您将获得Some(element),否则None。这与地图上的java get不同。 +未在选项上定义,这就是您收到错误的原因。

如果您确定地图包含该元素,则可以使用apply方法。 m.apply("foo")或含糖m("foo")