2011-01-03 16 views
2

해당 특성의 형식 매개 변수의 형식 매개 변수에 특성에 액세스하고 싶습니다. 이 "2 차"유형 매개 변수를 특성에 대한 다른 "1 차"매개 변수로 추가하지 않아도됩니다. 다음은이 문제를 나타낸다 : [D [A]가 아니라 C는 [D [A1]을, 나타내는형식 매개 변수의 형식 매개 변수에 액세스

sealed trait A; sealed trait A1 extends A; sealed trait A2 extends A 
trait B[ ASpecific <: A ] { type ASpec = ASpecific } 
trait D[ ASpecific <: A ] extends B[ ASpecific ] 
trait C[ +BSpecific <: B[ _ <: A ]] { 
    def unaryOp : C[ D[ BSpecific#ASpec ]] 
} 

def test(c: C[ B[ A1 ]]) : C[ D[ A1 ]] = c.unaryOp 

테스트는 c.unaryOp는 타입 C의 결과가 분명히 때문에 컴파일 실패를 ASpec _ < : A의 지름길 일 뿐이며 특정 유형 매개 변수를 나타내지 않습니다.

두 형 파라미터 해결책은 간단하다 :

sealed trait A; sealed trait A1 extends A; sealed trait A2 extends A 
trait B[ ASpecific <: A ] 
trait D[ ASpecific <: A ] extends B[ ASpecific ] 
trait C[ ASpecific <: A, +BSpecific <: B[ ASpecific ]] { 
    def unaryOp : C[ ASpecific, D[ ASpecific ]] 
} 

def test(c: C[ A1, B[ A1 ]]) : C[ A1, D[ A1 ]] = c.unaryOp 

하지만 난 분명히 중복이 두 번째, 매개 변수를 사용하여 내 소스를 혼란해야하는 이유 이해가 안 돼요. 특성 B에서 그것을 검색 할 수있는 방법이 없을까요?

답변

1

나는 C의 유형 별칭을 추가하여 컴파일 할 수있다 :

sealed trait A; sealed trait A1 extends A; sealed trait A2 extends A 
trait B[ ASpecific <: A ] { type ASpec = ASpecific } 
trait D[ ASpecific <: A ] extends B[ ASpecific ] 
trait C[ +BSpecific <: B[ _ <: A ]] { 
    type BSpec = BSpecific#ASpec 
    def unaryOp : C[ D[ BSpec ]] 
} 
def test[X <: C[ B[ A1 ]]](c:X): C[ D[ X#BSpec ]] = c.unaryOp 

테스트의 또 다른 향상된 버전 :

def test2[K <: A, X <: C[ B[ K ]]](c:X): C[ D[ X#BSpec ]] = c.unaryOp 

은 당신의 의도를 변경하지 않은 바랍니다.

0

@pedrofurla (내가 로그인하지 않고 질문으로 죄송 직접 회신 할 수 없습니다)

귀하의 예제 컴파일하지만, 내가 정확하게 X#BSpec_ <: A의 별칭 인 때문에 그에서 아무것도하지만 C[D[A]]을받지 생각합니다. ..

val x: C[D[A1]] = test(new C[B[A1]] {}) 

<console>:34: error: type mismatch; 
found : C[D[A]] 
required: C[D[A1]] 
     val x: C[D[A1]] = test(new C[B[A1]] {}) 
          ^
+0

나는 더 나은 표정을 가지고 있습니다 ... – pedrofurla

+0

지금까지 성공하지 못했습니다 ... :( – pedrofurla

관련 문제