Questa risposta è di 2 anni di ritardo, ancora fo Per il beneficio degli altri, vorrei sottolineare che la risposta accettata si estende inutilmente da AnyVal.
C'è solo un piccolo bug che deve essere corretto nella risposta originale. Il metodo def **
richiede un solo parametro, vale a dire l'esponente poiché la base è già passata nel costruttore e non due come nel codice originale. Fissaggio e la rimozione che i risultati backticks in:
import scala.math.pow
implicit class PowerInt(i: Int) {
def ** (b: Int): Int = pow(i, b).intValue
}
Che funziona come previsto come visto here.
Scala compilatore lancerà un Int
ad un PowerInt
solo se il metodo che si chiama su di esso non è definito. Ecco perché non è necessario estendere da AnyVal.
Dietro le quinte, Scala cerca una classe implicita il cui tipo di argomento costruttore è uguale al tipo dell'oggetto che viene lanciato. Poiché l'oggetto può avere un solo tipo, le classi implicite non possono avere più di un argomento nel loro costruttore. Inoltre, se si definiscono due classi implicite con lo stesso tipo di costruttore, assicurarsi che le loro funzioni abbiano firme univoche altrimenti Scala non saprebbe a quale classe eseguire il cast e si lamenterà dell'ambiguità.
Si noti che '**' né '^' non avranno la precedenza a destra (questo è il motivo per cui lo stdlib non lo include). '4 * 5 ** 3' è' (4 * 5) ** 3' e non '4 * (5 ** 3)'. – sschaef
Scala potrebbe modificare i propri metodi di analisi su una grammatica non LL (1); per esempio: vedi come C++ gestisce più '>' '<' deterministicamente –