2012-08-30 9 views
5

Scala 2.9.2で、依存する戻り値の型を宣言するメソッドの実装に問題があります。次のコードは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 = ??? 
    } 
} 

は、コンパイル時に、次のエラーメッセージが表示されます。問題が修正されているようだ

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のいずれかの見通しはあるのでしょうか?)

答えて

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 = ??? 
    } 
} 
+0

です。残念なことに私の実際のケースでは、オブジェクトZは内部実装であり、外部の消費者は特性Zのみを参照するので、これは実際に入力したものを達成しません。 –

+0

エスケープしようとする時間は2.9でしょう。 –