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

Scala 指向函数的不同重载之一的指针,scala,Scala,我尝试了以下方法: def doOperation(op: (Int, Int) => Int) = { op(42, 42) } doOperation(Int.+) 但我得到了以下错误: Error: type mismatch; found : String => String required: (Int, Int) => Int doOperation(Int.+)

我尝试了以下方法:

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:::+
运算符,而编译器不够聪明,无法理解该选择哪一个。

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

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

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

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

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

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

首先,Int.+是一个参数方法,因此您应该尝试以下方法:

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

doOperation(Int.+)
要认识到它也不起作用,因为正如@m-z已经解释的,
Int.+
是一种尝试引用伴随对象
Int
的方法,它只有
box
unbox
方法和两个隐式转换。 但是,您可以尝试对Int的某个实例进行操作,如下所示:

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.+)

因为
+
是一个重载方法,编译器不知道将哪个方法存储在
iplus
变量中。

首先,Int.+是一个参数方法,所以您应该尝试以下方法:

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

doOperation(Int.+)
要认识到它也不起作用,因为正如@m-z已经解释的,
Int.+
是一种尝试引用伴随对象
Int
的方法,它只有
box
unbox
方法和两个隐式转换。 但是,您可以尝试对Int的某个实例进行操作,如下所示:

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.+)
因为
+
是一个重载方法,编译器不知道将哪个方法存储在
iplus
变量中