2012-06-03 8 views
8

recursividad tipo directo simplemente funciona:indirectos recursivas definiciones de tipos genéricos en Scala

trait TT[T<:TT[T]] 

Pero puedo hecho una indirecta con enfoque ingenuo

trait UU[V <: VV[UU[V]]] 
trait VV[U <: UU[VV[U]]] 

me da error:

CyclicTraits.scala:23: error: type arguments [UU[V]] do not conform to 
    trait VV's type parameter bounds [U <: UU[VV[U]]] 
trait UU[V <: VV[UU[V]]] 
      ^
CyclicTraits.scala:25: error: type arguments [VV[U]] do not conform to 
    trait UU's type parameter bounds [V <: VV[UU[V]]] 
trait VV[U <: UU[VV[U]]] 
      ^

¿Cómo debe expresarse correctamente la recursión de parámetros de tipo indirecto?

Respuesta

11

El problema aquí no es la recursión: en realidad se trata de los parámetros de tipo que no se ajustan a los límites, como dice el mensaje de error. Su ejemplo funciona perfectamente si se hace el parámetros de covarianza:

trait UU[+V <: VV[UU[V]]] 
trait VV[+U <: UU[VV[U]]] 

En su versión (sin la covarianza), el hecho de que V es un subtipo de VV[UU[V]] nos dice nada acerca de si UU[V] o no es un subtipo de UU[VV[UU[V]]], entonces obtenemos el error de conformidad. Si los parámetros de tipo son covariantes, sabemos que V siendo un subtipo de VV[UU[V]] implica que UU[V] es un subtipo de UU[VV[UU[V]]], y todo está bien.