公共Scala构造函数字段在Java中不公开

时间:2017-07-09 11:22:53

标签: java scala

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

ng

字段class Vector2D(val x: Float, val y: Float) { } x在Java中不公开。例如:

y

但是,在Scala中,这将编译:

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

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

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

另一件有趣的事情是,IDE会在错误的代码下面放置一个红色下划线,但是无法在文件旁边显示错误图标,并且错误就像通常那样。

2 个答案:

答案 0 :(得分:2)

您可以使用像member_variable()这样的paranthesis从java访问scala类成员。

如果您打印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

答案 1 :(得分:2)

当Scala将其编译为类文件时,xy变量可通过相同名称的方法访问。因此,在Java中,您可以通过调用x()来访问此变量。

请注意,在Scala中,调用方法时使用括号通常是可选的,这就是为什么它看起来像是直接访问变量。