是什么导致以下代码在Scala 2.11中产生编译错误?
class Foo {
def fn(a: Seq[Int], b: Int => Int) {}
// Comment this line out
def fn(a: Map[String, String], c: String => Double) {}
}
object Bar {
def main(args: Array[String]) {
val f = new Foo()
f.fn(Seq(1, 2), _ * 2)
}
}
错误:
Error:(9, 21) missing parameter type for expanded function ((x$1) => x$1.$times(2))
f.fn(Seq(1, 2), _ * 2)
^
但是,如果Map[String, String], String => Double
fn
版本的file.exists()
被注释掉,代码就会编译。我可以通过给编译器提供一两个提示来轻松解决这个问题,但我不想在Scala中明确指定类型: - )
答案 0 :(得分:3)
您为编译器创建了某种“鸡和蛋”问题:
*
的右侧不足以进行类型推断,因为{{1}本身可能会超载自己)。 编译器无法突破这个圈子,因而无法解决问题。你必须向编译器显示门:
答案 1 :(得分:2)
我认为编译器无法确定选择哪个重载,因为函数的类型未完全指定。在类型推断中辅助scala编译器的一种常用方法是使用多个参数块,例如:
class Foo {
def fn(a: Seq[Int])(b: Int => Int) {}
def fn(a: Map[String, String])(c: String => Double) {}
}
object Bar extends App {
val f = new Foo()
f.fn(Seq(1, 2))(_ * 2) // this works because the overload is chosen based on the first parameter list
}
如果您不想这样做,则必须更明确地指定函数的类型,如下所示:
f.fn(Seq(1,2), (x: Int) => x * 2)