Scala不让我添加整数

时间:2016-07-21 02:01:48

标签: scala type-conversion scala-implicits

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

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并没有帮助。)

3 个答案:

答案 0 :(得分:5)

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

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

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

(1 -> x) + 1

或使用中缀表示法:

1 -> x

(1, x)返回元组+,而元组没有String方法,因此编译器会尝试通过{{1}隐式将其转换为toString },因为String确实有+方法,最终会失败,因为需要Int

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

通过添加括号来修复:

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