如果特征A [+ T]扩展B,我是否应该能够传递需要B的A [T]类?

时间:2012-07-13 16:16:00

标签: scala

以下是我所处的具体情况(我不想简化它,以免错过错误原因):

在我正在工作的框架中有一个

trait RequestHeader{...}

和另一个特质

trait Request[+A] extends RequestHeader{...}

有一个函数需要接收类型为

的参数
def f(arg: RequestHeader => Result) = {...}

我希望能够传入

arg': Request[AnyContent] => Result

但是,这会导致编译器抱怨。这是为什么?

1 个答案:

答案 0 :(得分:8)

Function1在输入类型中是逆变的,如果您考虑它,这是有道理的。请考虑以下更简单的示例:

trait Foo
case object Bar extends Foo
case object Baz extends Foo

def f(g: Foo => Foo): Foo = g(Baz)

如果我向f提供Bar => Foo类型的函数,则无法将其应用于Baz。 (另一方面,Foo => Bar类型的函数将完全没问题。)