Non capisco il comportamento apparente contraddizione che sto vedendo nel codice seguente (Scala 2.9):Scala più conversioni implicite?
class Pimp1(val x : Double) {
def pluss(that : Pimp1) = x + that.x
def <(that : Pimp1) = x < that.x
}
object Pimp1 {
implicit def d2pimp(d : Double) = new Pimp1(d)
implicit def d2pimp(od : Option[Double]) = new Pimp1(od.get)
}
object Scratch2 extends App {
import Pimp1._
5.0.pluss(Some(5.0))
5.0 < Some(5.0)
}
Il '5.0.pluss (Alcuni (5.0))' linea di compilazione, ma la linea dopo essa non viene compilato con il seguente messaggio di errore:
valore metodo di overload < con alternative: (x: Double) booleano (x: Float) booleano (x: Long) booleano (x: Int) booleano (x: Char) Boolean (x: Short) Boolean (x: Byte) Boolean non può essere applicato a (Some [Double])
Se aggiungo esplicito < operatore alla classe Pimp che prende un'Opzione [Doppia]:
def <(that : Option[Double]) = x < that.get
tutto compila bene.
Ora, il mio modo di capire regole di conversione implicita Scala, questo ha perfettamente senso:
- Il compilatore capisce che non c'è '<' operatore doppio che accetta Opzione [Doppia]
- considera il conversione implicita in Pimp1.
- Se Pimp1 ha un operatore adatto, funziona, altrimenti genera un errore.
- È importante notare che il compilatore fa non considera l'applicazione di una seconda conversione implicita (disponibile), da Opzione [Doppio] a Pimp.
Ecco come mi aspettavo che le cose funzionassero.
Tuttavia, questo sembra essere contraddetto dal primo esempio, dove:
- Il compilatore vede che non c'è nessun metodo pluss su Double.
- Il compilatore prova la conversione implicita in Pimp, che ha un tale metodo.
- Tuttavia, per far funzionare l'operatore, il compilatore deve applicare una seconda conversione implicita, sull'argomento, per convertirlo in Pimp.
Secondo la logica sopra, questo non dovrebbe essere compilato, ma lo fa. Le regole di conversione implicite trattano metodi non esistenti e metodi di non corrispondenza in modo diverso?
È interessante, perché se lo si inverte, funziona: Alcuni (5.0) <5.0 – Noah