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

标签 scala

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

在我工作的框架中有一个

trait RequestHeader{...}

还有一个特点

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

有一个函数期望接收以下类型的参数:

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

我希望能够传入

arg': Request[AnyContent] => Result

但是,这会导致编译器报错。这是为什么?

最佳答案

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 类型的函数就可以了。)

关于scala - 如果特征 A[+T] 扩展 B,我是否应该能够在需要 B 的地方传递 A[T] 类型的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474337/

相关文章:

scala - 在 Gatling 中请求超时

scala - 为什么浏览 Scala api 这么难?

scala - 如何在 scala map 上使用 map/flatMap?

java - Scala 字节数组类型不匹配错误

在 Ubuntu 上安装 typesafe-stack 后,scala 不在路径上

scala - 在实践中使用 Scala Actor 编写应用程序 II

scala - 单元测试期间 Scala Deadline 的模拟时间

java - Spark2.2.1 不兼容 Jackson 版本 2.8.8

java - 多态性、自动装箱和隐式转换

scala - 两个字符串的叉积