Scala 如何找到阻止隐式转换的因素(pimp类)?

Scala 如何找到阻止隐式转换的因素(pimp类)?,scala,implicit,Scala,Implicit,我有一个使用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._ 使用数学的

我有一个使用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._
使用数学的代码如下所示:

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)value*不是com.jme3.math.Quaternion的成员

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

import Operators.QuaternionMath

import Operators._

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

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


对于Scala IDE有。

如果
四元数路径
确实在范围内,您应该能够编写

val m: location.of.Operators.QuaternionMath = QuaternionMath(q1)
m.*(c2)
如果第一行失败,它将告诉您

  • 找不到值
    四元数路径
    。这真的不在范围之内
  • 你不能这样叫它,然后你用另一种叫做
    QuaternionMath
    的东西来掩盖它。在这种情况下,您可以在IDE中直接跳转到阴影符号的源
  • 四元数路径
    不是
    运算符
    的成员(我猜是这样)。然后,
    操作符
    不是您想象的对象,而是另一个同名的对象。同样在IDE中,只需选择导入操作符的
    操作符
    位.\u并查找源代码(IntelliJ中的Ctrl-B)以验证您正在做您认为正在做的事情

什么是“看似无关的代码”?文件/包的结构是什么?很好。它显示了我的四元数路径是不明确的,因为导入的其他一些代码正在这样做:隐式定义四元数路径(a:Quaternion):四元数路径=运算符。四元数路径(a)我无法编写运算符。四元数路径,因为运算符不是导入的,只有运算符。\uu-我已经修复了这个问题,其余的建议和分析看起来非常好。好吧,尽管您的编辑
val m:Operators.QuaternionMath
->
val m:QuaternionMath
隐藏了我的观点-您可以有不同的同名
QuaternionMath
。我将撤销该编辑并完全限定
操作符。在
q1
上按
Ctrl+Shift+Q
时,会提供两种不同的隐式转换,这显示了歧义。