2009-12-11 6 views
19

Supposons que j'ai ceci:Existe-t-il un moyen de contrôler quelle conversion implicite sera utilisée par défaut?

class String2(val x:String) { 
    def *(times:Int) : String = { 
     val builder = new StringBuilder() 
     for(i <- 0 until times) { 
      builder.append(x) 
     } 
     builder.toString() 
    } 
} 

maintenant si j'ajoute cette implicite:

implicit def gimmeString2(y:String) = new String2(y) 

je vais obtenir une erreur de compilation parce stringWrapper ajoute cette implicite. Existe-t-il un moyen de dire au compilateur "ignorer les autres implicits, utilisez ceci", de sorte que je n'ai pas besoin d'instancier un objet String2 et de travailler dessus?

j'avoue l'exemple de code ne peut pas être le plus approprié (pour cette question), mais je pense qu'il va faire.

+0

double possible: http://stackoverflow.com/questions/1339148/avoiding-implicit-def-ambiguity-in-scala –

+0

Je ne pense pas qu'il soit un doublon. L'auteur de cette question voulait garder les deux implicites. Je n'en veux qu'un. – Geo

+0

Il existe une méthode très similaire, sinon identique à celle ci-dessus déjà disponible dans RichString. Si vous voulez que votre méthode soit utilisée, vous pouvez peut-être utiliser la technique d'importation a.b. {c => _} pour masquer c où c est le nom implicite de la méthode. –

Répondre

29

Scala 2.8 a ajouté un système d'établissement des priorités pour implicits. Il est expliqué dans ce SIP on the new Java arrays:

Lorsque l'on compare deux différentes alternatives applicables d'une méthode surchargée ou d'un implicite, chaque méthode obtient un point pour avoir des arguments plus spécifiques, et un autre point pour être défini dans une sous-classe appropriée. Une alternative « gagne » sur une autre si elle obtient un plus grand nombre de points dans ces deux comparaisons

concluant que si alternatives ont des types d'arguments identiques, celui qui est défini dans une sous-classe gagne. Par conséquent, je crois que vous pouvez déclarer implicits comme suit:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
Questions connexes