2013-11-11 3 views
1

Я пытаюсь реализовать признак «помощник протокола», который отвечает за сопоставление Prompts и Responses. Конечная цель состоит в том, чтобы иметь object, который определяет различные классы Prompt и Response как подклассы запечатанного признака, а затем имеет class, который смешивает в свойстве ProtocolSupport для этого объекта протокола. Проблема в том, что мой текущий подход не будет компилироваться, хотя я уверен, что он должен.Ошибка компилятора при использовании абстрактных типов

Вот дистиллированная версия того, что у меня есть:

trait Protocol { 
    type Response 
    type Prompt <: BasePrompt 

    trait BasePrompt { 
     type Data 
     def validate(response: Response): Validated[Data] 
    } 
} 

trait ProtocolSupport[P <: Protocol] { 
    def foo(prompt: P#Prompt, response: P#Response) = { 
     // compiler error 
     prompt.validate(response) 
    } 
} 

Компилятор не нравится response в качестве аргумента в prompt.validate:

[error] found : response.type (with underlying type P#Response) 
[error] required: _4.Response where val _4: P 
[error]     prompt.validate(response) 
[error]        ^

Это не очень полезно. кажется, что он хочет P.Response, но это именно то, что я даю, так что в чем проблема?

ответ

3

Компилятор абсолютно прав. Это семейный полиморфизм и компилятор, ожидающий тип из одного семейства (путь зависит от типа). Это должно быть выглядеть:

//dependent method type need to be used 
//it guaranty that prompt & response from the same hierarchy  
def foo(proto : P)(prompt: proto.Prompt, response: proto.Response) = { 

Потому что в вашем примере вы можете вызвать метод с случаями быстрых & реагировать с различной иерархии (тракты типа). Похоже, вы можете позвонить по телефону foo с prompt от HTTPProtocol, но response от JSONProtocol.

Обновление:

В зависимости Метод типа выпущен в SCALA 2.10 series

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