2012-08-30 16 views
5

Mam problem w Scali 2.9.2 implementacji metody deklarującej zależny typ zwracania. Poniższy kodJak można przesłonić metodę z zależnym typem zwracania?

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

podstawie pkt 2.9.2 produkuje następujący komunikat o błędzie podczas kompilacji:

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

W 2.10.0-M4 Problem wydaje się, że zostały ustalone, ale niestety mój projekt jest związany z 2.9 na teraz.

Czy można obejść ten problem w wersji 2.9.2?

(Alternatywnie, jest jakaś perspektywa 2.9.3 który obejmowałby backportowaną poprawkę z 2,10?)

Odpowiedz

3

Jeśli jesteś naprawdę zatrzymany z 2.9.x wówczas następujące mogą być obejście ty,

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

Rozumiem. Niestety w moim prawdziwym przypadku obiekt Z był wewnętrzną implementacją, a zewnętrzni konsumenci widzieli tylko cechę Z, więc nie osiągnęło to typowania, na które tak naprawdę czekam. –

+0

Czas próby ucieczki 2,9, jak sądzę. –

Powiązane problemy