隐式转换下面的代码不编译:Scala中从母体性状
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
}
}
输出:
MyExample.scala:18: error: type mismatch;
found : MyExample.this.Wrp[Boolean]
required: Boolean
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
^
但如果I:
1)把class Wrp
外侧基底
或
2)将BooleanOps
的主体移动到MyExample
一切都编译完成。
为什么原始示例没有工作?如果您对此行为有一些了解,请注意帮助。谢谢。
确实,这个工作,但我想重载'||'操作符的行为。 编译器找到具有相同名称('||')的方法,但参数类型不同('Wrp [Boolean]'而不是'Boolean'),所以它应该执行隐式搜索。如果我将隐式转换放在MyExample的主体中,或者如果我把'class Wrp'定义放在Base的外部,就会发生这种情况,正如问题中指定的那样。我不明白为什么这些解决方案有效,而最初的例子没有。 – perovic