您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java类中的Scala获取器和设置器

Java类中的Scala获取器和设置器

您只能这样做,而且您可能不想这样做已经足够困难。

不能 做的是编写一个裸露的java类,该类被神奇地解释为Scala获取器和设置器。原因是Scala将信息嵌入其getter和setter所需的类文件中(例如,是否存在零个参数块或一个空的参数块- JVM(或Java)中没有保留这种区别)。

可以 使用Java来实现Scala定义的接口(即特征):

// 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

但是由于它 确实 成功实现了特征,因此在将其键入为特征时可以根据需要使用它:

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

所以这真是个混蛋。无论如何,它都不是完美的,但是在某些情况下,它可能足以提供帮助。

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

(编辑:当然,没有绝对的理由要求编译器 必须 采取这种方式;有人可能会认为,将Java定义的getter / setter对解释为Scala对(即,如果类文件未明确表示它来自Scala)是一种是增强功能以??改善Java互操作性的理想选择。)

java 2022/1/1 18:37:58 有388人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶