2013-02-03 4 views
6

コンパイラは、「反変種A型は、型の共変位置で起こる」:A <:タイプBのいずれかであることを警告することはできません。この警告は、composeメソッドのtypeパラメータにあります。論理的には、型定義は私には合理的です。コンパイラがandと一緒にqualmsを持っていない場合、なぜ、その逆の問題?Scalaコンパイラは、反変種Aが型の共変位置で発生すると言うのはなぜですか?:A <:B型のいずれか?

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

エラーとして、Aの分散注釈が間違っています。共変位置である戻り値の型にAを使用することはできません。あなたは(引数として)適切な反変位置にAを使用していますFoo内の別の方法で持っていたと想像:そのFoo[X] <: Foo[Y]

  • X >: Y場合を意味

    • Foo[-A]

      trait Foo[-A] { 
          ... 
          def foo(a: A): Unit 
      } 
      

      を今、あなたはどのようにこのクラッシュ見ることができます返される値は宣言された戻り値の型のサブタイプかもしれません

    • したがって、-Aがここで合法であった場合、composeは、いくつかのA1 >: A
    • ためFoo[A1]を返すことがありますtrait Xtrait Y extends X { def bar() }
    • composeがにあなたのためので、例をFoo[X]

    を戻した場合foo呼び出しa.bar()

  • は、結果的にそれが壊れるFoo[Y]を想像言いますコンパイルするには、Aは不変でなければなりません。

  • 関連する問題