java下划线的转义_在Scala中转义Java互操作性的下划线假设我有⼀些Scala代码调⽤⼀个使⽤_作为标识符的Java库(⽽且这是⼀个很长的故事)。这是⼀个简化的例⼦:
public class StupidUnderscore {
public static String _() { return "Plea give me a real name!"; }
撑的意思
}
没问题吧?只是逃避它:
论语学而篇原文scala> StupidUnderscore.`_`
res0: String = Plea 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 perimental.macros
flect.macros.Context
def _impl(c: Context) = {
import c.univer._
万古长存>晨钟暮鼓
c.Expr[String](
Select(Ident(newTermName("StupidUnderscore")), newTermName("_"))排骨玉米海带汤
)
}
def `I'm not named _!` = macro _impl
}
接着:
scala> AwfulMacroHack.`I'm not named _!`
res0: String = Plea give me a real name!
山樵不过,我不确定这不是Java助⼿解决⽅案那么糟糕。