以下是我所处的具体情况(我不想简化它,以免错过错误原因):
在我正在工作的框架中有一个
trait RequestHeader{...}
和另一个特质
trait Request[+A] extends RequestHeader{...}
有一个函数需要接收类型为
的参数def f(arg: RequestHeader => Result) = {...}
我希望能够传入
arg': Request[AnyContent] => Result
但是,这会导致编译器抱怨。这是为什么?
答案 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
类型的函数将完全没问题。)