如何找到阻止隐式转换的内容(pimp类)?

时间:2016-01-06 18:00:33

标签: scala implicit

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

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隐式转换。有没有办法检查,某些工具或某些编译器开关?

2 个答案:

答案 0 :(得分:3)

如果QuaternionMath确实在范围内,您应该能够写

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

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

    找不到
  • QuaternionMath。它真的不在范围内
  • 你不能这样称呼它,然后你被其他名为QuaternionMath的东西遮住了。在这种情况下,您可以在IDE中跳转到该阴影符号的来源。
  • QuaternionMath不是Operators的成员(我猜这里)。然后Operators不是您想象的对象,而是另一个具有相同名称的对象。再次在IDE中,只需选择Operators的{​​{1}}位并查找源(IntelliJ中的Ctrl-B)以验证您正在执行您认为自己正在做的事情。

答案 1 :(得分:2)

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

对于Scala IDE,有implicit conversion highlighting