区分任何内容和A =>任何重载方法

时间:2014-11-19 19:07:07

标签: scala

我不确定我是否为这个问题选了一个好头衔。

假设以下代码:

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。如果是真的,为什么?

这种情况有其他选择吗?

1 个答案:

答案 0 :(得分:1)

因为它不使用Hindley-Milner型推断。 Scala构建在使用类型擦除的jvm上:类存在于运行时,但其参数类型不存在。如果您想消除一点点缺点,请阅读:Making the most of Scala's (extremely limited) type inference