6

编译器告诉我这不能带有以下警告:“逆变类型 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]
}

我所需要的只是一个它崩溃的例子。那我很开心。

4

1 回答 1

4

正如错误所说,您的方差注释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 Xtrait Y extends X { def bar() }
  • 想象一个打电话的Foo[Y]地方fooa.bar()
  • compose因此,如果允许返回,它将中断Foo[X]

因此,对于您要编译的示例,A必须是不变的。

于 2013-02-03T23:57:00.657 回答