Scala从父特征隐式转换

per*_*vic 13 scala implicit traits implicit-conversion

以下代码无法编译:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

MyExample.scala:18: error: type mismatch;
 found   : MyExample.this.Wrp[Boolean]
 required: Boolean
        val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
                                         ^
Run Code Online (Sandbox Code Playgroud)

但如果我:

1)把class Wrp基地外面

要么

2)移动的本体BooleanOps,以MyExample

一切都编译好了.

为什么原始示例不起作用?如果您对此行为有一些了解,请帮助我们.谢谢.

cba*_*tin 5

一个问题是def ||(wy: =>Wrp[Boolean])
如果你将def ||(wy: Wrp[Boolean])它重写为有效的参数的名称性质

但我同意,如果你在Wrp或BooleanOpsCls周围移动它是有效的!隐含解决方案的意图或错误?


jwv*_*wvh 1

如果您重命名该方法,原始示例将起作用||。编译器会找到该false.||()方法,并且不会费心去寻找也可能在那里工作的隐式方法。