2012-01-02 2 views
6

특성의 유형 매개 변수에 대한 제한을 완화하고 대신이를 증거 매개 변수 형식의 메소드에 적용하려고합니다. 일부 골격 설정을 감안할 때 :유형 매개 변수의 증명 매개 변수에 대한 상한 교환

trait StateX[Repr <: StateX[Repr]] extends State[Repr] { 
    protected def reader: Reader[Repr] 
    def observe: Observer[Repr] = Observer(reader) 
} 

을 그리고 이것은하지 않습니다 :

trait State[Repr] 
object Observer { 
    def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] = 
    new Observer[Repr] {} 
} 
trait Observer[A] 
trait Reader [A] 

이 작동

trait StateY[Repr] extends State[Repr] { 
    protected def reader: Reader[Repr] 
    def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader) 
} 

메시지 "inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]"으로. ev 증거가이 고찰을 제안하기 때문에, 나는 어떻게 StateY을 고칠 수 있는지 궁금합니다.

답변

6
귀하의 문제는 형태 A <:< B의 증거 유형 A의 값이 유형 B의 값으로 변환 할 수 있음을 의미에도 불구하고이 유형의 제약 조건을 사용하는 A <: B ... 참으로, 주된 이유를 의미하지 않는다는 것입니다

그러한 서브 타입 관계가 유지되지 않기 때문에, 통상의 형태 바운드는 아니고, 뷰 바운드가 정확하게 존재합니다.

따라서 Observerapply 메소드에 바인딩 Repr <: State[Repr]을 만족시키기에 충분한 StateY, Repr <:< State[Repr]의 제한이 아니다. StateX의 유형 매개 변수에 대한 제한 조건을 완화하려면 유일한 방법은 apply 메소드의 유형 매개 변수에 대한 제한을 약화시키는 것입니다. 그것은 당신에게 뭔가를 얻을 수 바운드 일반 타입 대신 바인딩보기,

object Observer { 
    def apply[Repr <% State[Repr]](reader : Reader[Repr]) : Observer[Repr] = 
    new Observer[Repr] {} 
} 

또는 대안 적으로,

object Observer { 
    def apply[Repr](reader : Reader[Repr]) 
       (implicit ev : Repr <:< State[Repr]) : Observer[Repr] = 
    new Observer[Repr] {} 
} 

오히려 전체에 제약을 사용하려는 경우를 사용하여 다음과 같습니다.

5

ReprState[Repr]으로 변환 할 수 있다는 증거가 있습니다. Reader [Repr]와 함께 할 수있는 것에 대해서는 아무 것도 말하지 않습니다.

A => B 인 경우 T [A]를 T [B]로 변환하는 일반적인 방법은 없습니다 (T와는 무관합니다). 공변량 T의 경우 가능하지만 언어에는 그러한 것이 없습니다 .

관련 문제