scala protected modifier转换为java类是public

时间:2016-03-10 10:30:40

标签: scala

在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是公共的吗?

为什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

首先, Scala protected Java protected不同:

protected对于相同的包子类 Scala {{ 1}}仅对子类可见,因此 Scala protect Java 更具限制性。

因此,protected访问修饰符与 Scala 访问修饰符不同,我们知道 Scala 会在JVM Level上运行,以便运行在JVM,它需要在JVM中生成兼容的字节代码

还有其他一些例子:

JVM

有一些关于 Scala Access 的参考:

Protected and private in Scala become public in Java

Scala Access

Protected Members

答案 1 :(得分:2)

我不确定,但这可能是因为类的伴随对象也应该能够访问scala中的类的受保护成员。并且因为伴随对象实际上是与其companioin类不同的类,所以scala必须在字节码中将protected成员编译为public