斯卡拉getter和setter方法在Java类(Scala getters and setters

2019-06-25 04:45发布

我想创建跟随斯卡拉制定者/吸气约定的Java类。

我尝试下面的简单类,但它不工作:

public class JavaA {
private int a = 0;

public int a() {
    return a;
}

public void a_$eq(int a) {
    this.a = a;
}
}

但是,当我尝试从斯卡拉访问:

val x = new JavaA
x.a = 1

我得到“重新分配到VAL”错误消息。 我试图寻找这一点,但所有的问题,我发现这里的其他方式,从斯卡拉到Java。

什么是做正确的方式?

谢谢!

Answer 1:

你只能排序做到这一点,它已经够难,你可能不想。

不能做的是写奇迹般地被解释为斯卡拉getter和setter裸Java类。 其原因是,斯卡拉把信息嵌入到类文件,它需要为它的getter和setter方法(如是否有零参数块或一个空参数块 - 这是不是保存在JVM上区分(或在Java中))。

可以做的是使用Java来实现斯卡拉定义的接口(即特征):

// GetSetA.scala
trait GetSetA { def a: Int; def a_=(a: Int): Unit }

// JavaUsesGSA.java
public class JavaUsesGSA implements GetSetA {
  private int a = 0;
  public int a() { return a; }
  public void a_$eq(int a) { this.a = a; }
}

不能做什么,即使如此,是直接使用类(再次因为Java不添加斯卡拉相应的注释信息):

scala> j.a = 5
<console>:8: error: reassignment to val
       j.a = 5

但因为成功实施特质,你可以使用它时,它的类型为性状的期望:

scala> (j: GetSetA).a = 5
(j: GetSetA).a: Int = 5

所以,这是相当鱼龙混杂。 不完美以任何手段,但它可能是足够的功能,以帮助在某些情况下。

(另一种选择,当然是提供从Java类的隐式转换到一个有一个getter / setter方法,它引用在Java类中的实际方法,这样,即使你不能从斯卡拉Java的继承。)

(编辑:当然没有关键的原因,编译器必须采取这种方式,人们可以说,解释的Java定义的getter / setter对,好像他们是斯卡拉的人(即如果类文件没有明确说这从Scala的)是一个很好的候选人功能增强,以提高Java的互操作性。)



Answer 2:

恐怕你不能。 在Scala中,存取器必须方法没有参数列表,像def a = _a 。 例如写作def a() = _a Scala中会导致同样的错误,也没有办法,你可以定义在Java中没有参数列表的方法。 您可以通过生成自己愚弄Scala编译器ScalaSignature ,但这可能是不值得的麻烦...



文章来源: Scala getters and setters in Java class