我有一个重载方法定义如下:
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)
,那将是一个额外的好处。
答案 0 :(得分:3)
您已经遇到编译器使用的启发式算法,以帮助避免类型的指数级复杂搜索。当方法重载时,它会尝试根据参数的类型消除歧义。不幸的是,参数也重载。它没有尝试可能性,而是抓住第一个浮现在脑海中的东西,但它并没有起作用。
你可以通过正确的方式欺骗它进行搜索:
g(math.max(_,_))
现在很明显,编译器现在很清楚它正在寻找Function2
并且即使max
的所有版本都必须是Function2
! - 足以使编译器搜索匹配(并且Double
与Double
匹配)。
答案 1 :(得分:1)
发布此消息后几分钟,我发现了这个解决方案:
g(math.max: ((Double, Double) => Double))
我仍然很好奇为什么Scala在第一种情况下会遇到这个问题。