2014-07-16 5 views
4

에서 이기종 유형의 경로 의존적 유형을 반환 :이 주어 패턴 일치

def test(in: Request): in.Result = in match { 
    case i: IntRequest => 1234 
    case _ => sys.error(s"Unsupported request $in") 
} 
:

trait Request { 
    type Result 
} 

trait IntRequest extends Request { 
    type Result = Int 
} 

내가 반환에 대한 스칼라 컴파일러가 행복 할 수있는 방법을 패턴 일치를 기반으로 경로 의존의 형태

오류 :

<console>:53: error: type mismatch; 
found : Int(1234) 
required: in.Result 
     case i: IntRequest => 1234 
          ^

답변

5

다음 작품 :

trait Request { 
    type Result 
} 

final class IntRequest extends Request { 
    type Result = Int 
} 

trait Service { 
    def handle[Res](in: Request { type Result = Res }): Res 
} 

trait IntService extends Service { 
    def handle[Res](in: Request { type Result = Res }): Res = in match { 
    case i: IntRequest => 1234 
    case _ => sys.error(s"Unsupported request $in") 
    } 
} 

trait Test { 
    def service: Service 

    def test(in: Request): in.Result = service.handle[in.Result](in) 
} 

컴파일러는 final class을 사용하는 경우에만 먹습니다.

0

필자는 종속 형식 패턴 일치 대신 형식 클래스를 사용하는 것이 더 좋습니다.이 형식에서는 재정의해야하므로이 경우 인수 내에서 요청을 다시 정의 할 필요가 없습니다.

trait Request[T] { 
    type Result = T 
} 

trait IntRequest extends Request[Int] { 
} 

def test[T](in: Request[T]): T = in match { 
    case i: IntRequest => 123 
    case _ => sys.error(s"Unsupported request $in") 
} 

test(new IntRequest {}) // 123 

test(new Request[String] {}) // error 
+1

예, 가능성이 있습니다. 그러나 나는 이것들을'Map'에 저장하고 있기 때문에, 컴파일러 관점에서 타입 파라미터가 손실됩니다. 그래서 여기에 유형 멤버를 사용하고 싶습니다. –