Scala不让我添加整数

Buc*_*ris 0 scala type-conversion scala-implicits

这里有一些看起来合理的代码:

val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我得到两个这样的错误:

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)
                                                                   ^
Run Code Online (Sandbox Code Playgroud)

据我所知,我的编译器正在尝试使用字符串添加实现+.但为什么这样做呢?如何让编译器在这里使用整数加法?

(Int改为Integer没有帮助.)

Mic*_*jac 5

这是一个更简单的例子,它重现了错误:

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
                                   ^
Run Code Online (Sandbox Code Playgroud)

游戏中的所有操作符都是左关联的,因此所有操作符都是从左到右读取的.也就是说,调用链看起来像这样:

1.->(x).+(1)
Run Code Online (Sandbox Code Playgroud)

或使用中缀表示法:

(1 -> x) + 1
Run Code Online (Sandbox Code Playgroud)

1 -> x返回一个元组,(1, x)而元组没有+方法,因此编译器会尝试将其隐式转换为Stringvia toString,因为String它有一个+方法,最终因为Int需要而失败.

只需使用括号将事物分组:

scala> def foo(x: Int) = 1 -> (x + 1)
foo: (x: Int)(Int, Int)
Run Code Online (Sandbox Code Playgroud)