2012-08-30 207 views
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.9.3的任何前景,其中將包括從2.10反向移植修復?)

回答

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的時間,我猜。 –