编译器告诉我这不能带有警告:"逆变型 A 出现在类型>:A <:任何类型 B 的协变位置。警告位于撰写方法的类型参数中。从逻辑上讲,类型定义对我来说很有意义。如果编译器对 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
可能会为某些A1 >: A
返回Foo[A1]
- 说
trait X
和trait Y extends X { def bar() }
- 想象一下
Foo[Y]
,foo
打电话给a.bar()
- 因此,如果允许
compose
返回Foo[X]
,它将中断
因此,对于要编译的示例,A
必须是不变的。