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

问题描述 投票:1回答:1

我遇到这种情况,当存在具有相同数量参数的重载函数时,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编译器不能推断出类型?

scala
1个回答
2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.