我尝试了以下内容:
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::+
运算符有很多重载,并且编译器不够聪明,无法理解选择哪一个。
答案 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.+)
是重载方法,编译器不知道在+
变量中存储哪一个。