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

G33*_*33K 1 scala map scala-collections

这是代码:

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

这是错误:

Error:(28, 9) type mismatch;
 found   : AnyVal
 required: String
    i=i+i
        ^
Run Code Online (Sandbox Code Playgroud)

为什么i突然变成AnyVal?为什么String这里需要我的地图中的值Long

非常感谢

Mic*_*jac 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
Run Code Online (Sandbox Code Playgroud)

i不是一个Long,而是一个Option[Long],因为foo可能不是在一个关键HashMap.

如果我不得不猜测为什么说它String是必需的,那就是scala编译器试图隐式转换Option[Long] toString以便使用该+方法.

如果你真的想加倍i,那你就需要mapOption

i.map(x => x + x)
Run Code Online (Sandbox Code Playgroud)

在这种情况下仍然是None.