【问题标题】:How to find what is preventing an implicit conversion (pimp class)?如何找到阻止隐式转换(皮条客类)的原因?
【发布时间】:2016-01-07 05:55:59
【问题描述】:

我有一个使用 pimped jme 四元数数学的代码。数学扩展(用于 Java jMonkeyEngine 四元数)如下所示:

object Operators {
  implicit class QuaternionMath(val a: Quaternion) extends AnyVal {
    def * (b: Quaternion) = a mult b
    //def * (b: Float) = a mult b
  }
}

使用数学的代码如下所示:

import Operators._

...以及稍后在函数中:

def compute(q1: Quaternion, q2: Quaternion) = {
  q1 * q2
}

现在,在添加了一些似乎不相关的代码后,我得到了一个语法错误:

错误:(477, 10) 值 * 不是 com.jme3.math.Quaternion 的成员

要修复错误,我需要在计算之前重复导入,再次作为通配符或特定通配符:

import Operators.QuaternionMath

import Operators._

我不知道是什么隐藏了 QuaternionMath 隐式转换。有什么方法可以检查,一些工具,或者一些编译器开关?

【问题讨论】:

  • 什么是“看似无关的代码”?文件/包结构是什么?

标签: scala implicit


【解决方案1】:

如果QuaternionMath真的在范围内,你应该可以写

val m: location.of.Operators.QuaternionMath = QuaternionMath(q1)
m.*(c2)

如果第一行失败,它会告诉任何一个

  • QuaternionMath 未找到。真的不在范围内
  • 你不能这样称呼它,然后你用另一个叫做QuaternionMath的东西遮蔽了它。在这种情况下,您可以在 IDE 中直接跳转到该阴影符号的来源。
  • QuaternionMath 不是Operators 的成员(我猜这里)。那么Operators 不是您想象的那个 对象,而是另一个具有相同名称的对象。再次在 IDE 中,只需选择 import Operators._Operators 位并查找源代码(IntelliJ 中的 Ctrl-B)以验证您正在做您认为您正在做的事情。

【讨论】:

  • 太棒了。它表明我的 QuaternionMath 是模棱两可的,因为导入的其他一些代码正在这样做:implicit def QuaternionMath(a: Quaternion): QuaternionMath = Operators.QuaternionMath(a)
  • 我不能写 Operators.QuaterionMath,因为没有导入 Operators,只有 Operators._ - 我已经解决了这个问题,其余的建议和分析似乎真的很好。
  • 好吧,虽然你的编辑 val m: Operators.QuaternionMath -> val m: QuaternionMath 隐藏了我的观点 - 你可以有不同的同名 QuaternionMath。我将撤消该编辑并改为完全限定Operators
【解决方案2】:

如果您使用 IntelliJ IDEA for Scala,请尝试通过选择表达式并按 ctrl+shift+q 来检查可能的隐式转换( ctrl+q for Mac),检查this tutorial

对于 Scala IDE,有 implicit conversion highlighting

【讨论】:

  • 不错。当在q1 上按Ctrl+Shift+Q 时,我得到了两种不同的隐式转换,这显示了歧义。
猜你喜欢
  • 2019-06-01
  • 2021-03-16
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2016-07-09
相关资源
最近更新 更多