如何找到阻止隐式转换的原因 (pimp class)?

How to find what is preventing an implicit conversion (pimp class)?

我有一个使用 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
}

现在,在添加了一些看似不相关的代码后,出现语法错误:

Error:(477, 10) value * is not a member of com.jme3.math.Quaternion

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

import Operators.QuaternionMath

import Operators._

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

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

对于 Scala IDE 有 implicit conversion highlighting

如果 QuaternionMath 确实在范围内,你应该可以写

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

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

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