Scala类型系统,约束成员';s type by自身类型的参数

Scala类型系统,约束成员';s type by自身类型的参数,scala,types,Scala,Types,我不太确定这里的标准术语,所以我将尝试描述我正在尝试做的事情。如果你好奇的话,我实际上要写的应用程序是一个异步任务队列,类似于Resque或rq 我有一个类型TaskDef[ArgsT将它们定义为抽象类型: trait TaskDef { type Arguments <: AnyVal type Result <: AnyVal } trait TaskDef{ type Arguments是@rightfold给出的答案的补充: 如果希望始终使用类型参数,则需要

我不太确定这里的标准术语,所以我将尝试描述我正在尝试做的事情。如果你好奇的话,我实际上要写的应用程序是一个异步任务队列,类似于Resque或rq


我有一个类型
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