来自父特征的 Scala 隐式转换

标签 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基地外

或者

2)移动BooleanOps的主体至 MyExample
一切都编译。

为什么原始示例不起作用?如果您对这种行为有一些了解,我们将不胜感激。谢谢你。

最佳答案

一个问题是 def ||(wy: =>Wrp[Boolean]) 中参数的按名称调用性质。
如果你把它改写为 def ||(wy: Wrp[Boolean])有用

但我同意,如果您在 Wrp 或 BooleanOpsCls 周围移动它会起作用,这很奇怪!隐式解析的意图或错误?

关于来自父特征的 Scala 隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957948/

相关文章:

sql - mysql日期时间比较

ScalaTest 测试序列是否已排序

scala - 如何使用 "implicit"作为 apply() 参数?

scala - Scala 2.10.2 隐式可能存在的错误

c++ - 通过 "pass by value"将一个函数传递给另一个函数

带有 Coproduct 和 monad 转换器的 Scala Free Monads

scala - 如何在运行期间在Spark中设置执行程序内存

string - scala中原始字符串插值和三引号有什么区别

scala - Scala 中隐式参数的两种不同用途?

scala - 尝试使用异常日志记录