2009-12-11 11 views
19

Supongamos que tengo esto:¿Hay alguna manera de controlar qué conversión implícita será la predeterminada utilizada?

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

ahora si añado esta implícita:

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

que se producirá un error de compilación porque stringWrapper también añade esta implícita. ¿Hay alguna manera de decirle al compilador "ignorar otras implicidades, usar esto", para que no tenga que instanciar un objeto String2 y trabajar en eso?

Admito que el código de ejemplo puede no ser el más apropiado (para esta pregunta), pero creo que sí.

+0

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

+0

no creo que es un duplicado. El autor de esa pregunta quería mantener ambas implicaciones. Solo quiero uno. – Geo

+0

Hay un método muy similar, si no idéntico, al anterior ya disponible en RichString. Si desea que se use su método, quizás pueda utilizar la técnica import a.b. {c => _} para ocultar c donde c es el nombre del método implícito. –

Respuesta

29

Scala 2.8 agregó un sistema de priorización para implicits. Se explica en este SIP on the new Java arrays:

Al comparar dos alternativas aplicables diferentes de un método sobrecargado o de una implícita, cada método obtiene un punto por tener argumentos más específicos, y otro punto para ser definido en una subclase apropiada. Una alternativa “gana” sobre otro si se pone un mayor número de puntos en estas dos comparaciones

concluyendo que si alternativas tienen tipos de argumentos idénticos, el cual se define en una subclase victorias. Por lo tanto yo creo que se podría declarar implícitos de la siguiente manera:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
Cuestiones relacionadas