2015-06-25 2 views
0

Я бы хотел попросить некоторую помощь для продвинутых разработчиков 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() 
} 

ответ

0

Я не совсем понимаю, рассуждения 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] 
+0

Спасибо! Странно, но это работает. –

Смежные вопросы