【问题标题】:How to check which implicits are ambiguous?如何检查哪些隐含是模棱两可的?
【发布时间】:2019-02-20 10:12:26
【问题描述】:

我定义了以下隐式转换,这有助于我将一些 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,但它只显示了我对布尔值的转换和对字符串的一些转换,看起来不错。

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    隐式转换不能有歧义。如果范围匹配中有多个转换,编译器会报错。

    在调用this.someValue 时,您能否确认toBoolean 转换确实在范围内?

    【讨论】:

    • 是的,它在范围内。当我将它用作toBoolean(this.someValue) 时,它工作正常。
    • 正如我所说的,我在搜索时无法找到并且模棱两可的隐含。也许编译器不使用它还有其他一些原因,但我看不到它。该函数在范围内并且是隐式的,相同的代码在独立示例中可以正常工作,但在实际项目中却不行。
    • if (this.someValue == true) 有什么改变吗?
    • 好吧,它可以编译,但是 == 可以编译任何东西。不过,IDE 向我发出警告“比较不相关的类型”。我无法检查哪个比较实现被称为运行时,因为该项目当前包含其他错误,阻止它编译。
    • 你能创建一个例子,你可以在这里发布产生错误的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2023-03-24
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多