2014-07-07 2 views
1

한 f- 바운드 형식에서 다른 형식으로 투영 할 때 이해할 수없는 형식 오류가 발생합니다. related to an earlier question 일지 모르지만 확실하지 않습니다.재귀 (f 바운드 형식)에 형식 투영을 사용할 수 없습니다.

셋업은 간단하다 :

입니다
trait Foo[F <: Foo[F]] { 
    type I <: Foo[I] 
} 

, 내가 다른 유사한 시스템에 돌출부를 포함하는 시스템 F 있습니다.

이제 내가해야 할 일은 F이 주어지면 F#I을 사용할 수 있습니다. 그러나 컴파일러는 불평합니다 :

trait Test { 
    def apply[F <: Foo[F]]: Unit = bar[F#I] // type error 
    def bar [F <: Foo[F]]: Unit = ??? 
} 

<console>:52: error: type arguments [F#I] do not conform to method bar's 
    type parameter bounds [F <: Foo[F]] 
      def apply[F <: Foo[F]]: Unit = bar[F#I] 
              ^

왜 그렇습니까? 그리고 해결책이 있습니까?


사실, 무슨 일이 일어나고 있는지 설명하지 않습니다 this problem의 변형이 될 것으로 보인다.


편집 : 예를 들어, 다음과 같은 컴파일 :

trait Test { 
    def apply[F <: Foo[F] { type I = I1 }, I1 <: Foo[I1]]: Unit = bar[I1] 
    def bar [F <: Foo[F]]: Unit = ??? 
} 

이제 문제는 최대 내 API의 수준 수십 통해 엿 같은 유형 매개 변수 I1 의지 거품, 그래서 정말 필요가있다 두 번째 형식 매개 변수를 피하는 솔루션을 찾으십시오. 이다

trait Foo[F <: Foo[F]] { 
    type I <: Foo[I] 
    type Tx <: Txn[F] 
} 

trait Txn[F <: Foo[F]] { 
    val foo: F 
} 

trait Test { 
    def apply[F <: Foo[F]](implicit tx: F#Tx): Unit = { 
    val foo: F = tx.foo 
    bar[F, foo.I](tx) 
    } 

    def bar[F <: Foo[F], I <: Foo[I]](implicit tx: F#Tx): Unit = ??? 
} 

, 나는 내가 경로 생성을 얻을 수있는에서 이 필요합니다 :이 작품은 주위 이전에 사용을 찾을 때까지

답변

0

좋아, 그래서, 기존의 코드베이스를 통해 갔다 종형은 다시 행복해진다.

원본 코드가 거부 된 이유를 이해하는 데 여전히 관심이 있습니다.

관련 문제