我如何实现具体 class 扩展特征,通过类型参数的类型别名定义类型的方法

How can I implement concrete class which extends trait defining a method with type by the type parameter's type alias

我想为高级 Scala 开发人员寻求一些帮助。我的问题是我想访问属于 class' parent.

类型参数的类型别名
  case class MyModel(foo: String = "bar")

  case class MyDispatcher()

  trait Module[M, D] {
    type Dispatcher = D
    type Model = M
  }

  trait MySpecificModule[A <: Module[_, _]] {
    def dispatcher(): A#Dispatcher
  }

  class ModuleClass extends Module[MyModel, MyDispatcher] {
    //...
  }

  class MySpecificModuleClass extends MySpecificModule[ModuleClass] {
    override def dispatcher(): MyDispatcher = MyDispatcher()
  }

所以基本上 MySpecificModule 扩展了一个通用特征,并且应该知道 dispatcher 方法的类型。在 MySpecificModuleClass 这种情况下,它应该是 MyDispatcher。但是当我尝试编译这段代码时,我遇到了编译错误,因为方法的类型与定义的不同:A#Dispatcher,但实际上是这样。

Error:(21, 18) overriding method dispatcher in trait MySpecificModule of type ()_;
 method dispatcher has incompatible type
    override def dispatcher(): MyDispatcher = MyDispatcher()

             ^

如果您提出任何建议,我将不胜感激。提前致谢, 嘉宝

已解决

case class MyModel(foo: String = "bar")

case class MyDispatcher()

trait AbstractModule {
  type Dispatcher
  type Model
}

trait Module[M, D] extends AbstractModule {
  type Dispatcher = D
  type Model = M
}

trait MySpecificModule[A <: AbstractModule] {
  def dispatcher(): A#Dispatcher
}

class ModuleClass extends Module[MyModel, MyDispatcher] {
  //...
}

class MySpecificModuleClass extends MySpecificModule[ModuleClass] {
  override def dispatcher(): MyDispatcher = MyDispatcher()
}

我不完全理解 Scala 在这里的推理,但是如果你去掉类型参数,事情就开始起作用了:

case class MyModel(foo: String = "bar")

case class MyDispatcher()

trait Module {
  type Dispatcher
  type Model
}

trait MySpecificModule[A <: Module] {
  def dispatcher(): A#Dispatcher
}

class ModuleClass extends Module {
  type Model = MyModel
  type Dispatcher = MyDispatcher
  //...
}

class MySpecificModuleClass extends MySpecificModule[ModuleClass] {
  override def dispatcher(): MyDispatcher = MyDispatcher()
}

如果你真的想要那些类型参数,你可以引入一个辅助特征:

trait AbstractModule[M, D] extends Module {
  type Model = M
  type Dispatcher = D
}

class ModuleClass extends AbstractModule[MyModel,MyDispatcher]