我不确定我是否为这个问题选了一个好头衔。
假设以下代码:
object Test {
def f1[A](p1: A => Int) = println("f1")
def f1[A](p1: A => Int, p2: A => Int) = println("f2")
}
执行Test.f1[String](_.toInt)
会返回以下错误:
error: missing parameter type for expanded function ((x$1) => x$1.toInt)
Test.f1[String](_.toInt)
^
但是Test.f1[String]((a: String) => a.toInt)
会毫无错误地执行。
如果我从f1
对象中删除了第二个Test
方法,则代码也将执行。
似乎Scala在决定重载方法之前需要了解参数类型。在这种情况下,它无法区分任何内容和A => Int
。如果是真的,为什么?
这种情况有其他选择吗?
答案 0 :(得分:1)
因为它不使用Hindley-Milner型推断。 Scala构建在使用类型擦除的jvm上:类存在于运行时,但其参数类型不存在。如果您想消除一点点缺点,请阅读:Making the most of Scala's (extremely limited) type inference