2013-06-04 3 views
1

내 특성 Outer에는 두 개의 추상 멤버 유형 Inner1Inner2이 있어야합니다. Inner2에 추상 회원 유형 Inner1 (을)를 갖고 싶습니다. Outer#Inner1Inner2#Inner1과 같아야한다는 요구 사항을 지정하고 싶습니다. 이것을하는 가장 설득력있는 방법은 무엇입니까? 지금까지 내가 가지고있다추상 멤버 유형의 평등에 대한 요구 사항은 무엇입니까?

trait HaveInner1 { 
    type Inner1 
} 

trait Outer { 
    type Inner1 
    type Inner2 <: HaveInner1 

    // require Inner1 == Inner2#Inner1; 
    def ?[T](implicit v: T): T = v 
    implicit var ev: Inner2#Inner1 =:= Inner1 = ?[Inner2#Inner1 =:= Inner1] 
} 

마지막 두 문장은 그다지 아름답 지 않다. 같은 일에 더 관용적 인 방법이 있습니까?

답변

2
trait HaveInner1 { 
    type Inner1 
} 

trait Outer /*extends HaveInner1*/ { outer => 
    type Inner1 
    type Inner2 <: HaveInner1 { type Inner1 = outer.Inner1 } 
} 
+0

감사합니다. 'Inner2 <: HaveInner1 {type Inner1 = Outer.this.Inner1}'을 사용하면'outer'는 필요하지 않습니다. –

+0

Google에 대한 몇 가지 조건을 말씀해주십시오. 스칼라에서 {type Inner1 = outer.Inner1}과 같은 표현을 어떻게 호출 할 수 있습니까? 내가 찾은 것 중 가장 가까운 것은 실존 유형이지만, 여기에 'forSome'을 추가 할 수없는 것 같습니다. –

+0

아마도 유형 정교?! –