Generics &引用;缺少参数类型“;在采用函数参数的重载泛型方法中

Generics &引用;缺少参数类型“;在采用函数参数的重载泛型方法中,generics,scala,overloading,type-inference,Generics,Scala,Overloading,Type Inference,我的DSL中存在过载泛型方法的问题,导致编译器希望我添加显式参数类型: def alpha[T](fun: Int => T): String = fun(33).toString def beta [T](fun: Int => T): String = fun(66).toString def beta [T](thunk: => T): String = thunk.toString alpha { _ + 11 } // ok beta { _

我的DSL中存在过载泛型方法的问题,导致编译器希望我添加显式参数类型:

def alpha[T](fun: Int => T): String = fun(33).toString

def beta [T](fun: Int => T): String = fun(66).toString
def beta [T](thunk:   => T): String = thunk.toString

alpha { _ + 11 }          // ok
beta { _ + 22 }           // "error: missing parameter type for expanded function"
beta { _: Int => _ + 22 } // ok... ouch.
我能把最后一行的乱七八糟的东西处理掉吗

编辑:

为了证明重载对scalac本身不是一个模糊问题,下面是一个没有类型参数的版本,它运行得非常好:

def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk:   => String): String = thunk.reverse

beta(_.toString)  // ok
beta("gaga")      // ok

正如您可能已经意识到的,问题的出现是因为您的beta函数过载。 定义时:

beta { _ + 22 }

你希望它调用哪个测试版?Scala不能仅仅因为将它与22相加就知道
\uu
Int
。因此,对于这个特定的示例,您必须定义什么是

问题是
Int=>T
也是一种类型。例如,假设您只定义了第二个
beta

def beta[ T ]( thunk: => T ) : String = thunk.toString
现在将函数
Int=>Int
传递给它:

scala> beta((_: Int) + 1)
res0: String = <function1>

Scala怎么能假设它是一个
Int
?您所展示的用于演示重载的示例不应受到责备。不要演示任何此类内容,因为您已经去掉了其中的类型参数。

可以,因为参数是Int=>t。Scalac知道在
alpha
的情况下,为什么在
beta
的情况下它不知道呢?因为
beta
是重载的,有两种选择,一种选择是
Int=>t
,另一种选择是
=>t
。这就是为什么在没有明确说明的情况下,不可能知道你指的是哪一个。阿尔法之所以有效,正是因为只有一次选择。这不是真的。这是一种缺陷,是由于具有类型参数而导致的。如果方法不是泛型的,那么我调用thunk还是函数版本是没有歧义的。我对问题进行了编辑以显示这一点。
scala> beta((_: String) + 11)
res1: String = <function1>