假设我有一些Scala代码调用一个使用_作为标识符的Java库(而且这是一个很长的故事)。这是一个简化的例子:
public class StupidUnderscore {
public static String _() { return "Please give me a real name!"; }
}
没问题吧?只是逃避它:
scala> StupidUnderscore.`_`
res0: String = Please give me a real name!
这一直是有效的,直到今天早上我尝试更新Scala 2.10.2:
scala> StupidUnderscore.`_`
:1: error: wildcard invalid as backquoted identifier
StupidUnderscore.`_`
^
这是由于在2.10.1中出现的a change,修复了this issue.从提交消息:
Prohibit _ as an identifier, it can only bring badness.
嗯,当然,但我不知道为什么这意味着我无法逃避它 – 我认为这是背后的引用。
我要写一个Java包装器才能使它工作吗?有没有其他方法可以在Scala中引用Java库的_方法?
作为脚注,我已经确认可以解决这个问题,而无需编写任何新的Java:
object AwfulMacroHack {
import scala.language.experimental.macros
import scala.reflect.macros.Context
def _impl(c: Context) = {
import c.universe._
c.Expr[String](
Select(Ident(newTermName("StupidUnderscore")), newTermName("_"))
)
}
def `I'm not named _!` = macro _impl
}
接着:
scala> AwfulMacroHack.`I'm not named _!`
res0: String = Please give me a real name!
不过,我不确定这不是Java助手解决方案那么糟糕。