作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编译器告诉我这不能带有以下警告:“逆变类型 A 出现在类型 >: A <: 任何类型 B 中的协变位置。”警告位于 compose 方法的类型参数中。从逻辑上讲,类型定义对我来说很有意义。如果编译器对 andThen 没有疑虑,那么为什么反过来会出现问题?
trait Foo[-A]{
def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this
def andThen[B <: A](t: Foo[B]): Foo[B]
}
最佳答案
正如错误所说,您的方差注释 A
是错的。您不能使用 A
在作为协变位置的返回类型中。想象一下你在 Foo
中有另一个方法使用 A
在适当的逆变位置(作为参数):
trait Foo[-A] {
...
def foo(a: A): Unit
}
Foo[-A]
意味着 Foo[X] <: Foo[Y]
如果 X >: Y
-A
在这里是合法的,compose
可能会返回 Foo[A1]
一些 A1 >: A
trait X
和 trait Y extends X { def bar() }
Foo[Y]
哪里foo
电话a.bar()
compose
会中断被允许返回 Foo[X]
A
必须是不变的。
关于scala - 为什么Scala编译器说逆变类型A出现在类型> : A <: Any of type B?的协变位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678518/
我是一名优秀的程序员,十分优秀!