Generics &引用;缺少参数类型“;在采用函数参数的重载泛型方法中
我的DSL中存在过载泛型方法的问题,导致编译器希望我添加显式参数类型: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 { _
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>