2012-08-30 9 views
5

Sto riscontrando problemi in Scala 2.9.2 che implementa un metodo che dichiara un tipo di ritorno dipendente. Il seguente codiceCome posso sovrascrivere un metodo con un tipo di ritorno dipendente?

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

sotto 2.9.2 produce il seguente messaggio di errore durante la compilazione:

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

In 2.10.0-M4 il problema sembra essere stato fissato, ma purtroppo il mio progetto è legato alla 2.9 per ora.

È possibile aggirare questo problema in 2.9.2?

(In alternativa, c'è qualche prospettiva di un 2.9.3 che dovrebbe includere la correzione backport da 2,10?)

risposta

3

Se sei veramente bloccato con 2.9.x allora la seguente potrebbe essere una soluzione per tu,

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

Vedo. Sfortunatamente nel mio caso reale l'oggetto Z era un'implementazione interna, e i consumatori esterni vedono solo il tratto Z, quindi questo non raggiunge la digitazione che sto davvero cercando. –

+0

Tempo di tentare di scappare 2.9, immagino. –

Problemi correlati