Scala类型系统,约束成员';s type by自身类型的参数
我不太确定这里的标准术语,所以我将尝试描述我正在尝试做的事情。如果你好奇的话,我实际上要写的应用程序是一个异步任务队列,类似于Resque或rqScala类型系统,约束成员';s type by自身类型的参数,scala,types,Scala,Types,我不太确定这里的标准术语,所以我将尝试描述我正在尝试做的事情。如果你好奇的话,我实际上要写的应用程序是一个异步任务队列,类似于Resque或rq 我有一个类型TaskDef[ArgsT将它们定义为抽象类型: trait TaskDef { type Arguments <: AnyVal type Result <: AnyVal } trait TaskDef{ type Arguments是@rightfold给出的答案的补充: 如果希望始终使用类型参数,则需要
我有一个类型
TaskDef[ArgsT将它们定义为抽象类型:
trait TaskDef {
type Arguments <: AnyVal
type Result <: AnyVal
}
trait TaskDef{
type Arguments是@rightfold给出的答案的补充:
如果希望始终使用类型参数,则需要将类型参数正确地传递给类型构造函数
对不起,这样说有点模棱两可,所以让我用我当前的代码作为一个具体的例子
trait TaskDef[ArgT_, ResT_] {
type ArgT = ArgT_
type ResT = ResT_
val name: String
def exec(arg: ArgT): String \/ ResT
}
class TaskInst[ArgT, ResT, DefT <: TaskDef[ArgT, ResT]] (
val id: UUID,
val defn: DefT,
val arg: ArgT
)
只是希望未来的读者不会像我一样陷入同样的困境
编辑:
作为进一步的补充,现在我已经试用了一天,我的印象是,这实际上不是异步任务的一个好数据模型。您最好结合使用,因为TaskDef
的独立实例并不真正有用。不太清楚这里发生了什么。看到了答案,正在阅读,然后看到了答案disappear。不太清楚答案是如何或为什么消失的。奇怪的服务器错误?但还是要感谢答案的作者!我正在编辑答案并制作一个SSCCE,所以我同时删除了它。哦,好的。谢谢!如果是服务器问题或类似问题,我将尽可能多地复制答案,以供未来读者参考谢谢你的解释,也谢谢你澄清了这项技术的标准名称!
trait TaskDef[ArgT_, ResT_] {
type ArgT = ArgT_
type ResT = ResT_
val name: String
def exec(arg: ArgT): String \/ ResT
}
class TaskInst[ArgT, ResT, DefT <: TaskDef[ArgT, ResT]] (
val id: UUID,
val defn: DefT,
val arg: ArgT
)
[error] /Users/mingp/Code/scala-redis-queue/src/main/scala/io/mingp/srq/core/TaskInst.scala:8: type mismatch;
[error] found : TaskInst.this.arg.type (with underlying type _$1)
[error] required: _$1
[error] val arg: DefT#ArgT_
[error] ^
[error] one error found