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

时间:2015-11-16 00:38:31

标签: scala scala-java-interop

在伴侣对象上定义val时,如下所示:

object Foo { val bar = 3 }

Scala生成静态最终方法:

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

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

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

1 个答案:

答案 0 :(得分:5)

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

这是Akka在Scala中不是100%写的原因之一:http://www.infoq.com/interviews/klang-akka

  

那么Akka写的是什么?

     

Akka不是百分之百的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 }