Il seguente codice non può essere compilato:Scala conversione implicita da genitore tratto
import scala.language.implicitConversions
trait Base {
class Wrp[+T](val v: T) // wrapper/internal representation
}
trait BooleanOps extends Base {
// implicit conversion
implicit def lift2BooleanOpsCls(x: Boolean): BooleanOpsCls =
new BooleanOpsCls(new Wrp[Boolean](x))
class BooleanOpsCls(wx: Wrp[Boolean]) {
def ||(wy: =>Wrp[Boolean]): Wrp[Boolean] = new Wrp[Boolean](wx.v || wy.v)
}
}
trait MyExample extends BooleanOps {
// test method
def foo(): Wrp[Boolean] = {
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
ret
}
}
uscita:
MyExample.scala:18: error: type mismatch;
found : MyExample.this.Wrp[Boolean]
required: Boolean
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
^
Ma se io:
1) messo la class Wrp
al di fuori di Base
o
2) spostare il corpo di BooleanOps
a MyExample
tutto compila.
Perché l'esempio originale non funziona? Se hai qualche idea in questo comportamento, l'aiuto sarebbe apprezzato. Grazie.
In effetti, questo funziona, ma sto cercando di sovraccaricare il comportamento dell'operatore '||'. Il compilatore trova il metodo con lo stesso nome ('||'), ma il tipo di argomento è diverso ('Wrp [Boolean]' invece di 'Boolean'), quindi dovrebbe eseguire la ricerca implicita. Questo accade davvero se metto la conversione implicita nel corpo di 'MyExample' o se inserisco la definizione' class Wrp' al di fuori di 'Base', come specificato nella domanda. Non capisco perché queste soluzioni funzionino e l'esempio originale no. – perovic