2013-03-18 8 views
3

Étant donné que j'ai le trait suivantconversion implicite sur les traits

trait Foo[T]{ 
    ... 
} 

J'ai des classes de cas qui utilisent ce trait et je voudrais être en mesure de convertir implicitement Foo [T] dans Foo [Z] (par exemple).

Par exemple, si j'ai une mise en œuvre concrète de

case class Blah[Model] extends Foo[Model] 

Et j'ai une conversion implicite du modèle pour voir ...

Comment puis-je encourager Scala à convertir Blah[Model]-Blah[View]?

trait Foo[T]{ 
    ... 
    // not sure what to do here! 
    implicit def convertTtoZ .... (implicit converter: T=>Z) ... 
} 

Répondre

3

Vous devez définir explicitement comment construire le trait avec un paramètre modifié:

scala> import language.implicitConversions 

scala> class M 
defined class M 

scala> class N 
defined class N 

scala> implicit def m2n(m: M): N = new N 
m2n: (m: M)N 

scala> class X[A](val a: A) {} 
defined class X 

scala> implicit def xa2xb[A,B](x: X[A])(implicit ab: A => B) = new X(ab(x.a)) 
xa2xb: [A, B](x: X[A])(implicit ab: A => B)X[B] 

scala> val xm = new X(new M) 
xm: X[M] = [email protected] 

scala> def xnRequired(xn: X[N]) { println("Hi!") } 
xnRequired: (xn: X[N])Unit 

scala> xnRequired(xm) 
Hi!