5

依存する戻り値の型を宣言するメソッドを実装する Scala 2.9.2 で問題が発生しています。次のコード

object DependentTypesQuestion {
  def ??? = throw new UnsupportedOperationException
  trait X {
    trait Y
  }
  trait Z {
    def z(x: X): x.Y
  }
  object Z extends Z {
    override def z(x: X): x.Y = ???
  }
}

2.9.2 の下では、コンパイル中に次のエラー メッセージが生成されます。

overriding method z in trait Z of type (x: DependentTypesQuestion.X)x.Y;  method z has incompatible type

2.10.0-M4 では問題が修正されたようですが、残念ながら私のプロジェクトは今のところ 2.9 に関連付けられています。

2.9.2 でこの問題を回避することはできますか?

(あるいは、2.10 からのバックポートされた修正を含む 2.9.3 の見込みはありますか?)

4

1 に答える 1

3

本当に 2.9.x に行き詰まっている場合は、次の方法で回避できます。

object DependentTypesQuestion {
  def ??? = throw new UnsupportedOperationException
  trait X {
    trait Y
  }
  trait Z[D[_ <: X with Singleton]] {
    def z[T <: X with Singleton](x: T): D[T]
  }

  type Dep[T <: X with Singleton] = T#Y

  object Z extends Z[Dep] {
    override def z[T <: X with Singleton](x: T): x.Y = ???
  }
}
于 2012-08-30T11:49:25.107 に答える