2014-09-01 50 views
1

下面是代码:斯卡拉:为什么AnyVal出现在这里?

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

非常感谢

回答

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一个Long,而是一个Option[Long],由于foo可能不是在HashMap的密钥。

如果我猜的话,为什么它说String是必需的,这将是Scala编译器试图隐式转换Option[Long]toString为了使用+方法。

如果你真的要仔细i,那么你就需要mapOption

i.map(x => x + x) 

在这种情况下仍然None

+0

“我不是一个长,而是一个选项[长],因为foo不是HashMap中的键。”好吧,即使''foo''是'm'中的一个键,'i'总是'Option [Long]'。你可能会吃肉,“因为foo可能不是关键”。 – 2014-09-01 19:32:22

+0

@KarolS是的,那将是正确的说法。 – 2014-09-01 19:35:14

2

Map[A,B]get方法返回一个Option[B]。如果有条目,您将得到Some(element),否则None。这不像地图上的java get+没有在选项中定义,这就是为什么你会得到错误。

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

+1

“+未定义在选项上,这就是为什么你会得到错误。” true,但是实际的错误是由于为了尝试应用字符串连接的'+'而隐式转换为'String'。这(错误)功能不会导致难以解释的错误。 – 2014-09-01 17:57:00

+0

@Paul是的,这似乎是正确的 – Kigyo 2014-09-01 22:57:24