加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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.从提交消息:

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助手解决方案那么糟糕。

解决方法

由于反引号是Java互操作标识符( e.g. Thread.yield())的机制,我怀疑有没有使用Reflection的另一种方法。我会说最好的赌注(直到错误修复)是在Java中编写一个静态帮助程序来访问_。

我知道这是完全可笑的,但它可能还是比使用反思更好。他们打破了与该补丁的Java互操作,所以他们最终必须解决这个问题。但是,直到他们做,我认为这只是破碎。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读