java下划线的转义_在Scala中转义Java互操作性的下划线

假设我有一些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助手解决方案那么糟糕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值