【问题标题】:Why does this not type check?为什么这不进行类型检查?
【发布时间】:2015-04-14 19:43:57
【问题描述】:

为什么下面的代码类型检查失败:

var a = Map.empty[String, Integer]
var b: Integer = a.getOrElse("", 0)
b += 1
b = b + 1
val c: Integer = a.getOrElse("", 0) + 1

前四行没问题,但最后一行失败并显示“类型不匹配:预期的字符串实际 Int”。这肯定与第 2 行和第 4 行的组合一样吗?

【问题讨论】:

  • 误导性错误来自Predef 中隐含的any2StringAdd。您可能希望使用 -Yno-predef 进行编译以避免此类意外,并显式导入您真正想要的隐式。

标签: scala


【解决方案1】:

尝试使用Int 而不是Integer

var a = Map.empty[String, Int]
var b: Int = a.getOrElse("", 0)
b += 1
b = b + 1
val c: Int = a.getOrElse("", 0) + 1

IntInteger 在 Scala 中不是同一个类型。来自this 发帖:

Integer 只是 java.lang.Integer 的别名。 Int 是具有额外功能的 Scala 整数。

所以发生的情况是,当你执行a.getOrElse("", 0) 时,返回类型是IntegerInt 的公共超类型,即Any。然后你尝试添加to anAny`,还是不行!

【讨论】:

  • 作为未来调试的补充。如果您查看原始 getOrElse 的类型,您会发现它是 Any。
  • 旁注:Integer 不是j.l.Integer 的别名,它是编译器自动导入的j.l.Integer
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多