whe*_*ies 6 scala covariance contravariance
编译器告诉我这不能带有以下警告:"逆变型A出现在类型中的协变位置>:A <:任何类型B" 警告位于compose方法的type参数中.从逻辑上讲,类型定义对我来说很有意义.如果编译器没有问题,那么为什么问题与converse有关?
trait Foo[-A]{
def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this
def andThen[B <: A](t: Foo[B]): Foo[B]
}
Run Code Online (Sandbox Code Playgroud)
我所需要的只是一个破坏的例子.然后我很高兴.
正如错误所示,您的方差注释A是错误的。A您不能在作为协变位置的返回类型中使用。想象一下,您有另一种方法,其中Foo使用A正确的逆变位置(作为参数):
trait Foo[-A] {
...
def foo(a: A): Unit
}
Run Code Online (Sandbox Code Playgroud)
现在你可以看到这是如何崩溃的:
Foo[-A]意味着Foo[X] <: Foo[Y]如果X >: Y-A在这里合法,compose可能会返回Foo[A1]一些A1 >: Atrait X和trait Y extends X { def bar() }Foo[Y]wherefoo调用a.bar()compose因此,如果允许返回它就会中断Foo[X]因此,对于要编译的示例,A必须是不变的。
| 归档时间: |
|
| 查看次数: |
1728 次 |
| 最近记录: |