你只能这样做,而且这已经足够困难了,你可能不想这样做。
你什么can't要做的就是编写一个裸 Java 类,它神奇地被解释为 Scala getter 和 setter。原因是 Scala 将其 getter 和 setter 所需的信息嵌入到类文件中(例如,是否有零个参数块或一个空参数块——JVM(或 Java)中没有保留这一区别)。
你什么cando 是使用 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; }
}
你什么can't即使如此,还是直接使用类(同样是因为Java没有为Scala添加适当的注释信息):
scala> j.a = 5
<console>:8: error: reassignment to val
j.a = 5
但自从它does成功实现该特征,当它被输入为特征时,您可以根据需要使用它:
scala> (j: GetSetA).a = 5
(j: GetSetA).a: Int = 5
所以这是一个鱼龙混杂的情况。无论如何并不完美,但它可能足以在某些情况下提供帮助。
(当然,另一种选择是提供从 Java 类到具有引用 Java 类上的实际方法的 getter/setter 的隐式转换;即使您不能让 Java 继承自 Scala,这也可以工作。 .)
(编辑:当然,编译器没有任何关键原因must这样做;有人可能会争辩说,将 Java 定义的 getter/setter 对解释为 Scala 的 getter/setter 对(即,如果类文件没有明确说明它来自 Scala),是增强功能以提高 Java 互操作性的良好候选者。)