如何检查哪些隐式含义不明确?

时间:2019-02-20 10:12:27

标签: scala implicit-conversion

我定义了以下隐式转换,这有助于我将一些Javascript代码移植到Scala:

  case class NullableBoolean(value: Boolean)

  implicit def toNullable(boolean: Boolean) = NullableBoolean(boolean)
  implicit def toBoolean(boolean: NullableBoolean) = boolean != null && boolean.value

然后使用如下代码:

class SomeClass {
  var x: NullableBoolean = _

  def set(v: Boolean): Unit = {
    x = v
  }

  def someOtherFunction(): Unit = {
    if (x) println("Yes")
    else print("No")
  }
}

val some = new SomeClass

some.someOtherFunction()
some.set(true)
some.someOtherFunction()

在小样本中使用时,一切正常。但是在实际项目中使用时,出现错误:

  

错误:(360,16)类型不匹配;

     

找到:xxx.NullableBoolean

     

必填:布尔值

 if (this.someValue) {

我怀疑这是由于导入了其他隐式转换而导致该转换不明确,但我找不到它。是否有某种方法或工具可以向我显示合格的转化,或者以其他方式帮助我确定歧义?我已经尝试过IntelliJ Shift-Ctrl-Q,但是它只显示了我到Boolean的转换以及一些到String的转换,这看起来还不错。

1 个答案:

答案 0 :(得分:0)

隐式转换不能是模棱两可的。如果范围匹配中有多个转换,则编译器会抱怨。

调用this.someValue时是否可以确认toBoolean转换确实在范围内?