假设我有两个使用相同名称和返回定义的方法,但是不同的参数:
def overload(x: Int) = x.toString
def overload(s: String) = s
现在我想将其中一个转换为函数。如果方法没有超载,我会这样做:
val f = overload _
但是既然如此,编译器正确地抱怨了一个含糊不清的引用。除了重命名其中一个之外,有没有办法制作一个或另一个重载方法的函数?
谢谢!
约翰
答案 0 :(得分:15)
当你直接调用它时,编译器知道调用哪个overload
的方式是通过知道它应用的参数的类型。 overload someInt
只能引用overload(x: Int)
,因此不存在歧义。
当你从中创建一个函数时,你还没有提供一个参数,所以编译器不知道你希望函数是什么类型的,所以它不知道你是哪个overload
指的是。
解决这个问题的简单方法是明确告诉它类型:
val f : Int => String = overload _
或:
val f = (x : Int => overload x)
或:
val f = overload (_ : Int)
(注意:我还没有测试过这些,但是它们的一些变化应该有效)