Après avoir regardé une vidéo sur YouTube avec le titre Scala Type Membres vs Type Paramètres. J'ai écrit ce qui suit.Paramètres de type pur et paramètre de type mixte avec le membre
version paramètre Purement type fonctionne bien
trait Joiner[Elem,R] { def join(xs: Seq[Elem]): R } object Program { def doJoin[T,R] (xs: T *) (implicit j: Joiner[T,R]): R = j.join (xs) def main(args: Array[String]): Unit = { implicit val charToStringJoiner = new Joiner[Char,String] { override def join(xs: Seq[Char]): String = xs.mkString("+") } implicit val charToInt = new Joiner[Char,Int] { override def join(xs: Seq[Char]): Int = xs.mkString.toInt } val s:String = doJoin[Char,String]('1','2') println(s) val n :Int = doJoin[Char,Int]('1','2') println(n) } }
Membre Mixte Type & version Paramètre -
trait Joiner[Elem] { type R def join(xs: Seq[Elem]): R } object Program { def doJoin[T] (xs: T *) (implicit j: Joiner[T]): j.R = j.join (xs) def main(args: Array[String]): Unit = { implicit val charToStringJoiner = new Joiner[Char] { override type R = String override def join(xs: Seq[Char]): String = xs.mkString("+") } implicit val charToInt = new Joiner[Char] { override type R = Int override def join(xs: Seq[Char]): Int = xs.mkString.toInt } val s:String = doJoin('1','2') //doesn't work println(s) val n :Int = doJoin('1','2') //doesn't work println(n) } }
version 1 est bien la version cependant 2 ne compile pas. Comment cela peut-il être fixé en ayant à la fois une portée implicite? Spécifiquement, comment puis-je spécifier le type de retour qui aidera le compilateur à résoudre l'implicite correct
Je ne pense pas que ce soit possible. Dans la plupart des cas, le compilateur ne peut être désambiguïsé que sur la première liste de paramètres. – jwvh