在Scala中转义Java互操作性的下划线
发布时间:2020-12-16 09:37:00 所属栏目:安全 来源:网络整理
导读:假设我有一些Scala代码调用一个使用_作为标识符的Java库(而且这是一个很长的故事)。这是一个简化的例子: public class StupidUnderscore { public static String _() { return "Please give me a real name!"; }} 没问题吧?只是逃避它: scala StupidUnder
假设我有一些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中出现的a change,修复了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助手解决方案那么糟糕。 解决方法
由于反引号是Java互操作标识符(
e.g.
Thread.yield() )的机制,我怀疑有没有使用Reflection的另一种方法。我会说最好的赌注(直到错误修复)是在Java中编写一个静态帮助程序来访问_。
我知道这是完全可笑的,但它可能还是比使用反思更好。他们打破了与该补丁的Java互操作,所以他们最终必须解决这个问题。但是,直到他们做,我认为这只是破碎。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在.sh文件中使用代码时,“bash:Bad substitution”
- 使用CXF开发WebService客户端
- angularjs – Angular.js和Adsense
- shell-正则表达式(一)
- twitter-bootstrap-3 – 如何在bootstrap3中重置模态的滚动
- 突出显示VIM中的所有大写单词
- angularjs – 使用grunt构建的Angular应用程序中遗漏的资产
- 在AngularJS中调用ajax之后呈现动态HTML(angularjs内容)内容
- angularjs – md-tab,右上角的按钮,角度材料
- twitter-bootstrap – Bootstrap 3下拉列表选择