嗨其他Scala开发人员,
有人可以向我解释以下代码中的类型推断有什么问题以及如何修复它。
以下代码是使用Scala 2.10.2
的Play 2.2的自定义操作class Test {
trait Entity
class NodeRequest[A,K <:Entity](val entity: K,
val request: Request[A])
extends WrappedRequest[A](request)
def LocateResource[A,K](itemId: Int, v: List[K],
forceOwners:Boolean = true) =
new ActionBuilder[NodeRequest[A,K]]() {
def invokeBlock[A](request: Request[A],
block: (NodeRequest[A,K]) => Future[SimpleResult]) = {
Future.successful(Ok)
}
}
[error] Test.this.NodeRequest[A,K] takes no type parameters, expected: one
[error] def LocateResource[A,K](itemId: Int, v: List[K] , forceOwners:Boolean = true) = new ActionBuilder[NodeRequest[A,K]]() {
[error] ^
答案 0 :(得分:5)
错误消息有点令人困惑 - 它实际上是指ActionBuilder的类型参数。您需要的是类型函数(或更具体地,部分类型的应用程序)。这在Scala中有点棘手。 Scala 2.8语言参考实际上说你做不到,但事实并非如此。试试这个:
def LocateResource[A,K](itemId: Int, v: List[K],
forceOwners:Boolean = true) =
new ActionBuilder[({type λ[B] = NodeRequest[B,K]})#λ]() {