2017-08-08 13 views
1

Ich habe einige Arten:Implizite Substitution

trait OutputHandler[A] 

case class TypeA() 

case class TypeB() 

Eine Methode, die einen impliziten Parameter nimmt:

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

Ein Wert wie folgt definiert:

implicit val handler = new OutputHandler[TypeA] {} 

Wie kann ich eine generische erstellen impliziter Wert von List[T] wo T kann jeder Typ sein, der einen impliziten Wert definiert hat? Das heißt, kann ich process(List(TypeA())) oder process(List(TypeB()) anrufen, wenn ich implicit val a: OutputHandler[TypeA], etc. habe?

Antwort

2

Sie können dies erreichen mit einem implicit def, dass die OutputHandler[List[A]] zurückgibt:

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

Danke. Das funktioniert – ntviet18