【问题标题】:scala protected modifier convert to java class is publicscala protected 修饰符转换为 java 类是公共的
【发布时间】:2016-06-25 03:24:54
【问题描述】:

在一个 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是公开的吗?

为什么?

谢谢!

【问题讨论】:

  • 可能与 Scala 中的 protected doesn't 与 Java 中的含义相同,但我无法将这些部分放在一起。

标签: scala


【解决方案1】:

首先,Scala protected 不同于 Java protected

Javaprotected同一个包子类 可见,Scala protect 是只对子类可见,所以ScalaprotectedJava的更严格。

所以这是由于JVM Level访问修饰符与Scala访问修饰符不同,我们知道ScalaJVM上运行,在JVM上运行,需要在JVM中生成兼容的字节码

还有一些其他的例子:

private
private[this]
private[package]

有一些关于Scala Access的参考:

Protected and private in Scala become public in Java

Scala Access

Protected Members

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多