2012-08-30 10 views
5

Ich habe Probleme in Scala 2.9.2 implementieren eine Methode, die einen abhängigen Rückgabetyp deklariert. Der folgende CodeWie kann ich eine Methode mit einem abhängigen Rückgabetyp überschreiben?

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

unter 2.9.2 erzeugt die folgende Fehlermeldung während der Kompilierung:

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

In 2.10.0-M4 scheint das Problem behoben worden, aber leider ist mein Projekt gebunden 2.9 für jetzt.

Kann dieses Problem in 2.9.2 umgehen?

(Alternativ gibt es eine Aussicht auf eine 2.9.3, die die zurückportiert fix von 2.10 enthalten würde?)

Antwort

3

Wenn Sie wirklich mit 2.9.x stecken dann die folgenden vielleicht eine Abhilfe sein für Sie,

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

Ich sehe. Leider war das Objekt Z in meinem realen Fall eine interne Implementierung, und externe Konsumenten sehen nur das Merkmal Z, also erreicht dies nicht die Typisierung, nach der ich wirklich suche. –

+0

Zeit zu versuchen, 2,9 zu entkommen, schätze ich. –

Verwandte Themen