2009-12-11 5 views
19

Supponiamo che io sono questo:Esiste un modo per controllare quale conversione implicita sarà utilizzata come predefinita?

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

ora se aggiungo questa implicita:

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

otterrò un errore di compilazione perché stringWrapper aggiunge anche questa implicita. C'è un modo per dire al compilatore "ignorare altri impliciti, usare questo", in modo da non dover istanziare un oggetto String2 e lavorarci sopra?

Ammetto che il codice di esempio potrebbe non essere il più appropriato (per questa domanda), ma penso che lo farà.

+0

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

+0

non credo che sia un duplicato L'autore di quella domanda voleva mantenere entrambi gli impliciti. Ne voglio solo uno. – Geo

+0

C'è un metodo molto simile, se non identico, a quello già disponibile in RichString. Se si desidera utilizzare il metodo, è possibile utilizzare la tecnica di importazione a.b. {c => _} per nascondere c dove c è il nome del metodo implicito. –

risposta

29

Scala 2.8 ha aggiunto un sistema di assegnazione di priorità per impliciti. E 'spiegato in questo SIP on the new Java arrays:

Quando si confrontano due diverse alternative applicabili di un metodo sovraccarico o di un implicito, ogni metodo ottiene un punto per avere argomenti più specifici, e un altro punto per essere definiti in un appropriato sottoclasse. Un'alternativa “vince” su un altro se si ottiene un maggior numero di punti in queste due confronti

concludendo che se le alternative hanno tipi di argomenti identici, quello che è definito in una sottoclasse vittorie. Quindi io credo che si possa dichiarare impliciti nel modo seguente:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
Problemi correlati