Poniższy kod nie kompiluje:Scala niejawna konwersja z dominującą cechą
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
}
}
wyjściowy:
MyExample.scala:18: error: type mismatch;
found : MyExample.this.Wrp[Boolean]
required: Boolean
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
^
Ale jeśli:
1) umieścić class Wrp
poza Bazy
lub
2) przenieś ciało BooleanOps
do MyExample
wszystko kompiluje.
Dlaczego oryginalny przykład nie działa? Jeśli masz wgląd w to zachowanie, pomoc będzie doceniona. Dziękuję Ci.
Rzeczywiście działa to, ale próbuję przeciążać zachowanie operatora "||". Kompilator znajduje metodę o tej samej nazwie ('||'), ale typ argumentu jest inny ('Wrp [Boolean]' zamiast 'Boolean'), więc powinien wykonać wyszukiwanie niejawne. Dzieje się tak naprawdę, jeśli umieściłem niejawną konwersję w treści "MyExample" lub gdy umieściłem definicję 'class Wrp' poza' Base', jak określono w pytaniu. Nie rozumiem, dlaczego te rozwiązania działają, a oryginalny przykład nie. – perovic