我有一个重载方法定义如下:
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 版本而不是双版本。如何调用我的重载方法
g
以 math.max 作为参数?如果我可以调用g(math.max)
,那将是一个额外的好处。没有下划线。
最佳答案
您遇到了编译器用来帮助避免指数级复杂搜索类型的启发式方法。当方法被重载时,它会尝试根据参数的类型来消除歧义。不幸的是,这个论点也被重载了。它没有尝试可能性,而是捕获了第一个想到的可能性,但它不起作用。
您可以通过询问正确的方式来欺骗它进行更多搜索:
g(math.max(_,_))
从符号上看,现在编译器很清楚它正在寻找
Function2
。并且——即使 max
的所有版本必须是 Function2
!-- 足以让编译器搜索匹配项(它匹配 Double
和 Double
)。
关于Scala重载高阶函数导致类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17249374/