2017-08-08 24 views
1

我有一些类型:隐取代

def process[A](a: Any => A)(implicit handler: OutputHandler[A]) {} 

的值定义为::

implicit val handler = new OutputHandler[TypeA] {} 

如何可以创建一个通用

trait OutputHandler[A] 

case class TypeA() 

case class TypeB() 

接受一个隐式参数的方法隐含值List[T]其中T可以是任何定义了隐式值的类型?也就是说,只要我有implicit val a: OutputHandler[TypeA]等,我可以拨打process(List(TypeA()))process(List(TypeB())吗?

回答

2

您可以用implicit def,返回OutputHandler[List[A]]实现这一点:

implicit val handler = new OutputHandler[TypeA] {} 

implicit def listOf[A](implicit ev: OutputHandler[A]): OutputHandler[List[A]] = new OutputHandler[List[A]] { 
    // can implement this output handler using ev: OutputHandler[A] 
} 

process(t => List(TypeA())) // compiles, because OutputHandler[TypeA] exists 
process(t => List(TypeB())) // does not compile, as expected, because there's no OutputHandler[TypeB] 
+0

谢谢。这样可行 – ntviet18