假设我有一些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.`_`
^
这是由于a change出现在2.10.1并修复了this issue。来自提交消息:
禁止
_
作为标识符,它只会带来不良。
嗯,当然,但我不知道为什么这意味着我无法逃脱它 - 我认为这是反引号的目的。
我是否必须编写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帮助程序解决方案更糟糕。
答案 0 :(得分:1)
由于反引号是用于标识符(e.g. Thread.yield()
)的Java互操作的 机制,我怀疑没有使用Reflection的另一种方法。我想说你最好的选择(在错误修复之前)是用Java编写一个静态帮助方法来访问_
。
我知道这完全是荒谬的,但它可能仍然比使用反射更好。他们打破了与该补丁的Java互操作,所以他们最终必须解决这个问题。然而,在他们这样做之前,我认为它刚刚破裂。