Я пытаюсь реализовать признак «помощник протокола», который отвечает за сопоставление 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
, но это именно то, что я даю, так что в чем проблема?