【问题标题】:Scala getters and setters in Java classJava类中的Scala getter和setter
【发布时间】:2012-06-09 11:17:54
【问题描述】:

我想创建一个遵循 Scala setters/getters 约定的 Java 类。

我尝试了以下简单的课程,但它不起作用:

public class JavaA {
private int a = 0;

public int a() {
    return a;
}

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

但是当我尝试从 scala 访问它时:

val x = new JavaA
x.a = 1

我收到“重新分配给 val”错误消息。我试图寻找这个,但我发现了从 scala 到 java 的所有问题。

正确的做法是什么?

谢谢!

【问题讨论】:

  • 我在 EMF(model2model、model2text 转换)方面做了很多工作,所以我想我会用 feature = value 而不是 setFeatute(value) 让代码更优雅。

标签: java scala getter-setter scala-java-interop


【解决方案1】:

你只能这样做,而且你可能不想这样做。

不能做的是编写一个裸Java类,它神奇地被解释为Scala getter和setter。原因是 Scala 将信息嵌入到它的 getter 和 setter 所需的类文件中(例如,是否有零参数块或一个空参数块——JVM(或 Java)中没有保留的区别)。

可以做的是使用 Java 来实现 Scala 定义的接口(即 trait):

// 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添加适当的注释信息):

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

但由于它确实成功实现了 trait,所以当它被输入为 trait 时,您可以根据需要使用它:

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

所以它是一个好坏参半的包。无论如何都不完美,但在某些情况下它可能足够实用。

(当然,另一种选择是提供从 Java 类到具有引用 Java 类上的真实方法的 getter/setter 的隐式转换;即使您没有 Java继承自 Scala。)

(编辑:当然,编译器必须以这种方式运行没有关键原因;有人可能会争辩说,将 Java 定义的 getter/setter 对解释为就好像它们是 Scala 的一样(即,如果类文件没有明确说它来自 Scala)是一个很好的候选者,可以通过功能增强来提高 Java 互操作性。)

【讨论】:

    【解决方案2】:

    恐怕你不能。在 Scala 中,访问器必须是没有参数列表的方法,例如 def a = _a。写作例如Scala 中的def a() = _a 会导致相同的错误,并且您无法在Java 中定义没有参数列表的方法。您可以通过生成自己的ScalaSignature 来欺骗 Scala 编译器,但这可能不值得这么麻烦……

    【讨论】:

    • 不过,问题不在于访问器。 println(x.a) 工作得很好(x.a_=(1) 也是如此)。
    • @TravisBrown 是的,因为根据语言规范,语法糖只有在存在这样的访问器时才有效。
    • scala 的例子并不完全正确,因为我记得,def a() = _a 没有定义一个空的 Parameterlist,而是一个使用 Unit 的。不确定这只是内部的还是在编译过程中仍然存在,但我猜它确实如此。
    • @kutschkem 你错了。 def a() = … 定义了一个空参数列表。
    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 2014-10-03
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多