【问题标题】:Scala: why AnyVal appears here?Scala:为什么 AnyVal 会出现在这里?
【发布时间】:2014-10-25 22:06:36
【问题描述】:

代码如下:

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

非常感谢

【问题讨论】:

    标签: scala map scala-collections


    【解决方案1】:

    你在 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

    【讨论】:

    • "i 不是 Long,而是 Option[Long],因为 foo 不是 HashMap 中的键。"好吧,i 永远是Option[Long],即使"foo"m 中的一个键。你可能会吃肉“因为 foo 可能不是关键”。
    • @KarolS 是的,这样说是正确的。
    【解决方案2】:

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

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

    【讨论】:

    • "+ 未在选项上定义,这就是您收到错误的原因。"是的,但实际错误是由于隐式转换为String 以尝试应用字符串连接+。这个(错误)功能导致难以解释的错误无穷无尽。
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2021-06-18
    相关资源
    最近更新 更多