Scala 不允许我添加整数

Scala not letting me add integers

下面是一些我觉得很合理的代码:

val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)

当我尝试编译它时,出现了两个这样的错误:

Error:(20, 68) type mismatch;
 found   : Int(1)
 required: String
    val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
                                                                   ^

我知道我的编译器正在尝试使用 + 的字符串添加实现。但它为什么要这样做呢?我如何要求编译器在这里使用整数加法?

(将 Int 更改为 Integer 没有帮助。)

这是一个重现错误的简单示例:

scala> def fail(x: Int) = 1 -> x + 1
<console>:10: error: type mismatch;
 found   : Int(1)
 required: String
       def fail(x: Int) = 1 -> x + 1
                                   ^

游戏中的所有运算符都是左结合的,因此所有内容都是从左到右读取的。也就是说,调用链如下所示:

1.->(x).+(1)

或使用中缀表示法:

(1 -> x) + 1

1 -> x returns 一个元组 (1, x) 和一个元组没有 + 方法,因此编译器试图将其隐式转换为 String 通过 toString,因为 String 确实有一个 + 方法,该方法最终失败,因为需要 Int

只需使用括号将事物适当分组即可:

scala> def foo(x: Int) = 1 -> (x + 1)
foo: (x: Int)(Int, Int)

问题是,根据 Scala's precedence rules->+ 绑定一样紧密,因为它以 - 开头。

通过添加括号修复:

val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> (x + 1), 2 -> (x + 2)))(4)

'->' has the same precedence as '+',所以 1 -> x + 1 解析为 (1 -> x) + 1。将括号添加为 1 -> (x + 1) 可修复此错误。