当具有相同数量的参数的重载函数时,为什么scala类型推断会失效?

时间:2018-03-05 09:33:29

标签: scala

我遇到这种情况,当存在具有相同参数数量的重载函数时,scala编译器无法推断出我的函数参数的类型:

class TypeInfer(self: Int, other: Int) {
  def test (num: Int, word: String, fun1: (Int, Int) => Int): Unit = {
    fun1(self, other)
  }

  def test (word: String, num: Int, fun1: (Int, Int) => Int): Unit = {
    fun1(self,other)
  }
}

object main {
  def main(args: Array[String]): Unit = {
     val num1:Int = 1
     val num2:Int = 1
     val num3:Int = 1
     val infer = new TypeInfer(num1:Int,num2:Int)
     infer.test (num3, "hi", (x, y) => x+y) //error:compiler couldn't infer type of (x,y)=>x+y
   }
}

请注意,infer.test(num3, "hi", (x:Int, y:Int) => x+y)确实有效。 所以,似乎我必须明确指定我的函数参数的类型。但是没有歧义,为什么scala编译器不能推断出类型?

1 个答案:

答案 0 :(得分:2)

那里有一种固有的张力:对于Scala类型的推断,期望类型的概念很重要。对于方法参数,此预期类型由方法签名提供;但如果有多个具有相同参数数量的重载,则不清楚预期的类型应该是什么。

因此,Scala规范中的the definition of overloading resolution非常复杂。

这个特定情况实际上是自Scala 2.12以来修复的;在此之前,所有参数最初都以未定义的预期类型键入,从那时起

  

具有缺少参数类型的函数文字,使用期望的函数类型键入,该函数类型传播由找到的第i个参数类型指定的(SAM转换的)函数类型的完全定义类型的完全定义类型的最小上限在每个替代方案中所有其他参数都使用未定义的预期类型键入。