【问题标题】:Access scala class fields in java在java中访问scala类字段
【发布时间】:2020-09-02 11:16:05
【问题描述】:

我已经在 Scala 中定义了 A 类:

class A(var number: Int)

但是当我尝试在java中访问其成员字段number时,我得到一个错误:

A a = new A();
a.number = 4;

结果:java: number has private access in A。 如果我尝试从 scala 访问number,没有问题。

我可以做些什么来解决这个问题?

【问题讨论】:

  • Scala 是否会生成 getter 和 setter? getNumber() 和 setNumber(number) ?
  • 不,据我所知。
  • @SørenHN 确实如此。

标签: java scala scala-java-interop


【解决方案1】:

使用getter

a.number();

和二传手

a.number_$eq(4);

而不是字段本身a.number

或者

a.getNumber();
a.setNumber(4);

如果您对该字段进行注释

import scala.beans.BeanProperty

class A(@BeanProperty var number: Int)

如果我尝试从 scala 访问 number,没有问题。

在 Scala 中,当您编写 a.numbera.number = 4 时,您实际上调用的是 getter/setter(这是语法糖)。

【讨论】:

    【解决方案2】:

    你可以在编译A.scala时查看生成的类文件,这可以从Dmytro的回答中解释getter number()和setter方法number_$eq

    // A.scala
    class A(var number: Int)
    
    > scalac A.scala
    
    > javap -p A.class
    
    // output of above step
    
    public class A {
      private int number;
      public int number();
      public void number_$eq(int);
      public A(int);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多