2012-06-03 13 views
8

bezpośrednim rekursji prostu działa:pośrednie rekurencyjne definicje typów generycznych w Scala

trait TT[T<:TT[T]] 

Ale mogę się jedną pośrednią z naiwnego podejścia

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

dać mi błąd:

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]]] 
      ^

W jaki sposób należy poprawnie wyrazić rekurencję parametru typu pośredniego?

Odpowiedz

11

Problemem tutaj nie jest rekursja - w rzeczywistości jest to kwestia parametrów typu, które nie są zgodne z granicami, jak mówi komunikat o błędzie. Twój przykład działa doskonale, jeśli dokonać kowariantna parametry:

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

W swojej wersji (bez kowariancji), fakt, że V jest podtypem VV[UU[V]] mówi nam nic o tym, czy nie UU[V] jest podtypem UU[VV[UU[V]]], więc otrzymujemy błąd zgodności. Jeśli parametry typu są kowariancyjne, wiemy, że V będący podtypem VV[UU[V]] powoduje, że UU[V] jest podtypem UU[VV[UU[V]]] i wszystko jest w porządku.

Powiązane problemy