问题很简单。当我直接在构造函数中声明 Scala 字段时,如下所示:
class Vector2D(val x: Float, val y: Float) {
}
字段 x
和y
在 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());
}
}
另请参阅
关于java - 公共(public) Scala 构造函数字段在 Java 中不是公共(public)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44995846/