2012-06-03 44 views
8

loại đệ quy trực tiếp chỉ hoạt động:đệ quy định nghĩa kiểu generic gián tiếp trong scala

trait TT[T<:TT[T]] 

Nhưng tôi có thể thực hiện một gián tiếp với cách tiếp cận ngây thơ

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

cho tôi lỗi:

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

Việc đệ quy tham số kiểu gián tiếp nên được thể hiện đúng cách như thế nào?

Trả lời

11

Vấn đề ở đây không phải là đệ quy — nó thực sự là vấn đề của các thông số loại không phù hợp với giới hạn, như thông báo lỗi cho biết. Ví dụ của bạn hoạt động một cách hoàn hảo nếu bạn thực hiện các thông số hiệp biến:

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

Trong phiên bản của bạn (không có hiệp phương sai), thực tế là V là một subtype của VV[UU[V]] cho chúng ta biết gì về việc có hay không UU[V] là một subtype của UU[VV[UU[V]]], vì vậy chúng tôi nhận được lỗi tuân thủ. Nếu các tham số kiểu là covariant, chúng ta biết rằng V là một kiểu con của VV[UU[V]] đòi hỏi rằng UU[V] là một kiểu con của UU[VV[UU[V]]] và mọi thứ đều ổn.

Các vấn đề liên quan