【问题标题】:How to force scalac to generate a static final field?如何强制 scalac 生成静态最终字段?
【发布时间】:2015-11-16 00:38:30
【问题描述】:

在这样的伴随对象上定义 val 时:

object Foo { val bar = 3 }

Scala 生成静态最终方法:

$ scalac Foo.scala && javap Foo
public final class Foo {
  public static int bar();
}

有没有办法让它生成静态字段而不是静态方法?

FWIW,我需要它,因为我已经编译了 Java 代码并且我需要保持二进制兼容性。

【问题讨论】:

    标签: scala scala-java-interop


    【解决方案1】:

    目前没有办法在 Scala 中拥有类似 Java 的静态字段,无论它们是否是 final 的。请参阅此处的说明,例如:Why doesn't Scala have static members inside a class?

    这就是 Akka 没有 100% 用 Scala 编写的原因之一:http://www.infoq.com/interviews/klang-akka

    那么Akka在里面写了什么?

    Akka 不是 100% 的 Scala,因为有些构造你 由于性能原因,不能在 Scala 中真正表达,所以是静态的 例如字段,所以当你需要做一些棘手的事情时 并发你需要有静态字段,所以我认为它就像 百分之九十的 Scala,然后我们有一些 Java 的东西,只是因为我们 必须。

    您可以在 Java 端进行 Java/Scala 互操作,即根据您的情况创建某种适配器。

    static fields 有现有的实现,但尚不清楚何时会得到它:https://issues.scala-lang.org/browse/SI-4581

    我找不到编译此导入的方法:import scala.annotation.static。也许它不在我的 Scala 版本中,或者默认情况下被禁用。否则这就是答案:

    object Foo { @static final val bar: Int = 3 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多