1

我正在尝试实现一个“协议助手”特征,负责匹配PromptsResponses. 最终的目标是拥有一个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,但这正是我给它的,所以有什么问题?

4

1 回答 1

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) = {

因为在您的示例中,您可以使用提示实例调用方法并从不同的层次结构(类型路径)响应。看起来您可以使用from但from调用foo方法。promptHTTPProtocolresponseJSONProtocol

更新:

SCALA 2.10 系列中发布的依赖方法类型

于 2013-11-11T04:35:30.337 回答