这里有一些看起来合理的代码:
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
并没有帮助。)
答案 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)