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没有帮助.)
这是一个更简单的例子,它重现了错误:
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)