Я бы хотел попросить некоторую помощь для продвинутых разработчиков scala. Моя проблема в том, что я хотел бы получить доступ к псевдониму типа, принадлежащему параметрам типа родительского класса.Как я могу реализовать конкретный класс, который расширяет признак, определяющий метод с типом по типу типа типа псевдоним
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
. Но когда я пытаюсь скомпилировать этот код, я получаю ошибку компиляции, потому что тип метода не такой, как определено: , однако в реальности это так.
Error:(21, 18) overriding method dispatcher in trait MySpecificModule of type()_$2;
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()
}
Спасибо! Странно, но это работает. –