Scala重载的高阶函数导致类型错误

时间:2013-06-22 09:50:48

标签: scala types overloading

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

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)”。似乎编译器选择了math.max的Int版本而不是Double版本。

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

2 个答案:

答案 0 :(得分:3)

您已经遇到编译器使用的启发式算法,以帮助避免类型的指数级复杂搜索。当方法重载时,它会尝试根据参数的类型消除歧义。不幸的是,参数重载。它没有尝试可能性,而是抓住第一个浮现在脑海中的东西,但它并没有起作用。

你可以通过正确的方式欺骗​​它进行搜索:

g(math.max(_,_))

现在很明显,编译器现在很清楚它正在寻找Function2并且即使max的所有版本都必须是Function2! - 足以使编译器搜索匹配(并且DoubleDouble匹配)。

答案 1 :(得分:1)

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

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

我仍然很好奇为什么Scala在第一种情况下会遇到这个问题。