0__*_*0__ 7 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 { _ + 22 } // "error: missing parameter type for expanded function"
beta { _: Int => _ + 22 } // ok... ouch.
Run Code Online (Sandbox Code Playgroud)
我有可能摆脱最后一行的混乱局面吗?
编辑:
为了证明重载不是scalac本身的歧义问题,这里是一个没有类型参数的版本,它可以很好地工作:
def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk: => String): String = thunk.reverse
beta(_.toString) // ok
beta("gaga") // ok
Run Code Online (Sandbox Code Playgroud)
问题是这Int => T也是一种类型。例如,假设您只定义了第二个beta:
def beta[ T ]( thunk: => T ) : String = thunk.toString
Run Code Online (Sandbox Code Playgroud)
现在你将一个函数传递Int => Int给它:
scala> beta((_: Int) + 1)
res0: String = <function1>
Run Code Online (Sandbox Code Playgroud)
那么,假设有一个函数适合=> T,并且您也有一个Int => T,那么 Scala 应该如何知道您想要哪一个呢?它可能是一个String,例如:
scala> beta((_: String) + 11)
res1: String = <function1>
Run Code Online (Sandbox Code Playgroud)
Scala 如何假设它是一个Int?您所展示的用于演示重载的示例不应该受到指责,因此没有演示任何此类内容,因为您删除了其中的类型参数。
| 归档时间: |
|
| 查看次数: |
1011 次 |
| 最近记录: |