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

Hen*_*son 2 scala

这是我所处的确切情况(我不想简化它,因为害怕错过错误的原因):

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

trait RequestHeader{...}
Run Code Online (Sandbox Code Playgroud)

和另一个特点

trait Request[+A] extends RequestHeader{...}
Run Code Online (Sandbox Code Playgroud)

有一个函数需要接收类型的参数:

def f(arg: RequestHeader => Result) = {...}
Run Code Online (Sandbox Code Playgroud)

我希望能够传入

arg': Request[AnyContent] => Result
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*own 8

Function1它的输入类型是逆变的,如果你考虑它就有意义.请考虑以下更简单的示例:

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

def f(g: Foo => Foo): Foo = g(Baz)
Run Code Online (Sandbox Code Playgroud)

如果我给出f一个类型的函数Bar => Foo,它将无法应用它Baz.(Foo => Bar另一方面,类型的功能完全没问题.)