2012-08-30 14 views
5

Tengo problemas en Scala 2.9.2 implementando un método que declara un tipo de devolución dependiente. El siguiente código¿Cómo puedo anular un método con un tipo de devolución dependiente?

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

bajo 2.9.2 produce el siguiente mensaje de error durante la compilación:

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

En 2.10.0-M4 el problema parece haber sido fijada, pero por desgracia mi proyecto está ligado a 2.9 por ahora.

¿Es posible evitar este problema en 2.9.2?

(Alternativamente, ¿hay alguna posibilidad de una 2.9.3 que incluiría el arreglo portado desde 2,10?)

Respuesta

3

Si usted está realmente atascado con 2.9.x a continuación, el siguiente podría ser una solución para usted,

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

I see. Desafortunadamente, en mi caso real, el objeto Z era una implementación interna, y los consumidores externos solo ven el rasgo Z, por lo que no logro el tipeo que realmente estoy buscando. –

+0

Es hora de intentar escapar de 2.9, supongo. –

Cuestiones relacionadas