如何强制 scalac 生成静态最终字段?

How to force scalac to generate a static final field?

像这样在伴随对象上定义 vals 时:

object Foo { val bar = 3 }

Scala 生成静态最终方法:

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

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

FWIW,我需要它,因为我有现成的编译 Java 代码,我需要保持二进制兼容性。

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

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

So what is Akka write in it?

Akka is not one hundred percent Scala because some constructs you can’t really express in Scala for performance reasons, so static fields for example, so when you need to do some tricky stuff with concurrency you need to have static fields, so I think it’s like ninety percent Scala and then we have some Java stuff just because we have to.

您可以在 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 }