我如何实现具体 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]
我想为高级 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]