4

我有一个重载方法定义如下:

def g(f: () ⇒ Double): Object = null
def g(f: Double ⇒ Double): Object = null
def g(f: (Double, Double) ⇒ Double): Object = null

def h(f: (Double, Double) ⇒ Double): Object = null

虽然h(math.max _)按预期工作,但调用g(math.max _) 给我错误“重载方法......不能应用于((Int,Int)=> Int)”。似乎编译器选择了 Int 版本math.max而不是 Double 版本。

g如何以 math.max 作为参数调用我的重载方法?如果我可以在g(math.max)没有下划线的情况下调用,那将是一个额外的好处。

4

2 回答 2

3

您遇到了编译器用来帮助避免指数级复杂搜索类型的启发式方法。当方法被重载时,它会尝试根据参数的类型来消除歧义。不幸的是,这个论点也被重载了。它不是尝试可能性,而是抓住第一个想到的可能性,但它不起作用。

您可以通过询问正确的方式来欺骗它进行更多搜索:

g(math.max(_,_))

从符号上看,现在编译器很清楚它正在寻找 aFunction2并且——即使所有版本的maxmust be Function2!——足以让编译器搜索匹配项(并且它与 匹配DoubleDouble

于 2013-06-22T14:01:18.817 回答
1

发布后几分钟,我发现了这个解决方案:

g(math.max: ((Double, Double) => Double))

我仍然很好奇为什么 Scala 在第一种情况下会出现问题。

于 2013-06-22T09:54:41.970 回答