2017-08-08 26 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