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]どこにfoo電話するか想像してみてくださいa.bar()
  • composeその結果、戻ることが許可された場合、それは壊れますFoo[X]

したがって、コンパイルの例としては、A不変である必要があります。

于 2013-02-03T23:57:00.657 に答える