Scala从父特征隐式转换

时间:2016-01-22 23:59:00

标签: scala implicit-conversion implicit traits

以下代码无法编译:

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)
                                         ^

但如果我:

1)将class Wrp置于Base

之外

2)将BooleanOps的正文移至MyExample

一切都在编译。

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

3 个答案:

答案 0 :(得分:5)

一个问题是def ||(wy: =>Wrp[Boolean])中参数的逐个名称性质 如果你把它改写为def ||(wy: Wrp[Boolean])就行了

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

问题是没有一个名为Wrp的类(暂时忽略T) - Base没有定义Wrp而是定义了一个命名扩展Base的每个具体类的子类。暗示也是红鲱鱼。赠送的错误是提到MyExample.this.Wrp - 请记住,即使MyExample - val x = new MyExample类型为Object with MyExample,也没有此类。