java - 公共(public) Scala 构造函数字段在 Java 中不是公共(public)的

标签 java scala

问题很简单。当我直接在构造函数中声明 Scala 字段时,如下所示:

class Vector2D(val x: Float, val y: Float) {

}

字段 xy在 Java 中不是公开的。例如:

public class JavaMain {
    public static void main(String[] args) {
        Vector2D vec = new Vector2D(1, 2);
        System.out.println(vec.x); //Won't compile.
    }
}

但是,在 Scala 中这将编译:

object ScalaMain {
    def main(args: Array[String]) = {
        var vec = new Vector2D(1, 2);
        println(vec.x);
    }
}

为什么 Java 不能编译?有解决方法或正确的方法吗?

如果您想知道这些类位于同一个项目和同一个包中。我正在使用Scala IDE .

另一个有趣的事情是,IDE 会在不正确的代码下添加红色下划线,但无法像通常那样在有错误的文件旁边显示错误图标。

最佳答案

您可以使用括号从 java 访问 scala 类成员,如 member_variable()

如果打印 scala 编译类,您将看到定义为 def x()def y() 的访问器。

$ scalac -print Vector2d.scala
[[syntax trees at end of                   cleanup]] // Vector2d.scala
package <empty> {
  class Vector2D extends Object {
    <paramaccessor> private[this] val x: Float = _;
    <stable> <accessor> <paramaccessor> def x(): Float = Vector2D.this.x;
    <paramaccessor> private[this] val y: Float = _;
    <stable> <accessor> <paramaccessor> def y(): Float = Vector2D.this.y;
    def <init>(x: Float, y: Float): Vector2D = {
      Vector2D.this.x = x;
      Vector2D.this.y = y;
      Vector2D.super.<init>();
      ()
    }
  }
}

因此,在 Java 代码中,调用访问器 x()y()

public class JavaMain {

    public static void main(String[] args) {
        Vector2D vec = new Vector2D(1, 2);
        System.out.println(vec.x());
    }
}

另请参阅

Accessing Scala instance variables from Java in Eclipse

关于java - 公共(public) Scala 构造函数字段在 Java 中不是公共(public)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44995846/

相关文章:

scala - 如何在 Scala 中写入文件?

scala - 在 Play 中使用 "implicit request"是什么意思?

java - 如何在一个 session 中发送多封电子邮件?

java常循环性能优化

java - 如何将 java.sql.Timestamp 转换为 java.time.OffsetDateTime?

json - 在http4s上运行时使用Circe将递归数据结构编码为Json

scala - 将其中一个列表转换为一个列表中的一个的最佳方法?

java - 无法使用 selenium 识别 iframe

java - 如何使用 ASM 转换字节码以初始化静态 block 中的原始常量?

Java ByteBuffer - 在 put 调用链中相对重新定位?