假设我有一些 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.`_`
<console>:1: error: wildcard invalid as backquoted identifier
StupidUnderscore.`_`
^
这是由于2.10.1 中出现的更改并修复了此问题。从提交消息:
禁止
_
作为标识符,只能带来坏处。
好吧,当然,但我不知道为什么这意味着我无法逃避它——我认为这就是反引号的用途。
我是否必须编写一个 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 帮助程序解决方案更可怕。