在scala类中,我定义了受保护的字段和受保护的方法:
TestProtected.scala:
class TestProtected {
protected var f = 0
protected def m = 1
}
在我看来,它会将受保护的f和m转换为受java保护的字段和方法。但是当我使用jd-gui将TestProtected.class反编译为java文件时,结果超出了我的预期:
@ScalaSignature(bytes="...")
public class TestProtected
{
private int f= 0;
public int f() { return this.f; }
public void f$eq(int x$1) { this.f = x$1; }
public int m() {
return 1;
}
}
java文件中的f和m是公共的吗?
为什么?
谢谢!
答案 0 :(得分:5)
首先, Scala protected
与 Java protected
不同:
的protected
对于相同的包和子类, Scala {{ 1}}仅对子类可见,因此 Scala 的protect
比 Java 更具限制性。
因此,protected
访问修饰符与 Scala 访问修饰符不同,我们知道 Scala 会在JVM Level
上运行,以便运行在JVM
,它需要在JVM
中生成兼容的字节代码。
还有其他一些例子:
JVM
有一些关于 Scala Access 的参考:
答案 1 :(得分:2)
我不确定,但这可能是因为类的伴随对象也应该能够访问scala中的类的受保护成员。并且因为伴随对象实际上是与其companioin类不同的类,所以scala必须在字节码中将protected
成员编译为public
。