将函数传递给Scala中的重载方法

时间:2016-03-02 09:24:32

标签: scala

我在Scala中传递对重载方法的函数引用时遇到了一个有趣的问题(使用2.11.7)

以下代码按预期工作

def myFunc(a: Int, b: String): Double = {
  a.toDouble + b.toDouble
}


def anotherFunc(value: String, func: (Int, String) => Double) = {
  func(111, value)
}

anotherFunc("123123", myFunc)

但以下代码无法编译

def myFunc(a: Int, b: String): Double = {
  a.toDouble + b.toDouble
}


def anotherFunc(value: String, func: (Int, String) => Double) = {
  func(111, value)
}

def anotherFunc(value: Int, func: (Int, String) => Double) = {
  func(value, "123123")
}

anotherFunc("123123", myFunc)

编译器喊出以下内容

scala> anotherFunc("123123", myFunc)
<console>:13: error: type mismatch;
 found   : String("123123")
 required: Int
       anotherFunc("123123", myFunc)

2 个答案:

答案 0 :(得分:2)

您使用的是Scala REPL吗?其中一个设计决策是,如果您有两个定义了相同名称的变量/函数,那么&#34;最后定义的胜利&#34;。在你的情况下,它是一个带有Int参数的函数。

您可以使用以下方法在REPL中打印所有已定义的符号:

$intp.definedTerms.foreach(println)

此处有人有类似问题:Why its possible to declare variable with same name in the REPL?

答案 1 :(得分:1)

我不知道原因,但似乎你必须写

anotherFunc("123123", myFunc _)

让它发挥作用。