指向函数的不同重载之一的指针

时间:2016-03-21 17:44:23

标签: scala

我尝试了以下内容:

def doOperation(op: (Int, Int) => Int) = {
    op(42, 42)
}

doOperation(Int.+)

但是我收到了以下错误:

Error: type mismatch;
 found   : String => String
 required: (Int, Int) => Int
                doOperation(Int.+)
                                ^

这是因为scala中Int::+运算符有很多重载,并且编译器不够聪明,无法理解选择哪一个。

2 个答案:

答案 0 :(得分:4)

Int.+正试图在companion object of Int上调用+方法。这不存在,因此错误。您需要一个函数(Int, Int) => Int,您可以匿名创建,如下所示:

scala> doOperation((a, b) => a + b)
res9: Int = 84

或简称:

scala> doOperation(_ + _)
res10: Int = 84

答案 1 :(得分:1)

首先,Int。+是一种参数方法,所以你应该尝试这样做:

def doOperation(op: (Int) => Int) = {
    op(42)
}

doOperation(Int.+)

意识到它既不起作用,因为正如@mz已经解释的那样,Int.+试图引用同伴对象Int的方法,该对象只有{{1} },box方法和一些隐式转换。 但是,您可以尝试对Int的某个实例进行操作,如下所示:

unbox

这可以按预期工作。

旁注。这不起作用:

def doOperation(op: (Int) => Int) = {
    op(42)
}
val i = 7
doOperation(i.+)

因为def doOperation(op: (Int) => Int) = { op(42) } val i = 7 val iplus = i.+ doOperation(i.+) 是重载方法,编译器不知道在+变量中存储哪一个。