问题很简单。当我在构造函数中直接声明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会在错误的代码下面放置一个红色下划线,但是无法在文件旁边显示错误图标,并且错误就像通常那样。
答案 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());
}
}
答案 1 :(得分:2)
当Scala将其编译为类文件时,x
和y
变量可通过相同名称的方法访问。因此,在Java中,您可以通过调用x()
来访问此变量。
请注意,在Scala中,调用方法时使用括号通常是可选的,这就是为什么它看起来像是直接访问变量。