2014-07-10 1 views
1

예제 코드 :기본 클래스에 링크 된 하위 클래스에 대해 암시 적으로 가져 오는 방법은 무엇입니까?

trait A 
case class B() extends A 
case class C() extends A 

trait D[T] 
implicit object DB extends D[B] 
implicit object DC extends D[C] 

def getImplicit[T: D](arg: T) = implicitly[D[T]] 

val list = Seq(B(), C()) 
list map getImplicit 

내가 얻을 수있는 방법을 명시 적으로 목록에있는 개체를 캐스팅없이 implicits? 어쩌면 내가 HList로 할 수 있을까? 아니면 매크로가 나를 도울 수 있습니까?

내가 시도 :

case class Wrap[T](v: T) 
object getImplicit extends (Wrap ~> D) { 
    def apply[T](arg: Wrap[T]) = implicitly[D[T]] 
} 

val list = Wrap(B()) :: Wrap(C()) :: HNil 
list map getImplicit 

그리고 난 컴파일 오류 얻을 : 당신은 getImplicit의 적용 방법에 유형의 클래스를 제공해야합니다

could not find implicit value for parameter e: D[T] 
     def apply[T](arg: Wrap[T]) = implicitly[D[T]] 
+0

scala-macros 태그를 삭제하는 것이 좋습니다. – gzm0

답변

2

합니다. 당신의 코드는 컴파일이 변경 후

object getImplicit extends Poly1 { 
    implicit def default[T: D] = at[Wrap[T]](_ => implicitly[D[T]]) 
} 

: 불행하게도 당신이 Poly1의 긴 형식을 사용해야합니다 의미합니다.

관련 문제