【问题标题】:Can I create a method with Java protected access in Scala?我可以在 Scala 中创建一个具有 Java 保护访问的方法吗?
【发布时间】:2011-12-27 23:44:43
【问题描述】:

我有一个已移植到 Scala 的 Java 类,但它仍然有一些 Java 子类实现抽象功能。

原来的 Java 有

public abstract class Base {
    ...
    protected abstract Foo getFoo();
}

被扩展了

public class Fred extends Base {
    ...
    protected Foo getFoo() {
        return foo;
    }
}

现在当我将 Base 移植到 Scala 时

class Base {
    ...
    protected def getFoo(): Foo
}

编译器抱怨说

不能降低继承方法的可见性...


现在我明白了,因为它的规则略有不同,Scala 倾向于在编译器而不是字节码中强制可见性,因此 getFoo 在 javap'd 类中被标记为 public。但是

protected[packagename] def getFoo()

仍然不会生成 pukka (Java) 保护方法,尽管我认为可见性应该是相同的。

有什么方法可以说服 Scala 编译器发出 Java 认为受保护的方法?

【问题讨论】:

  • 我会接受权威的“不”
  • 很好的问题。在到达此页面之前,我遵循了完全相同的路径。

标签: scala visibility protected


【解决方案1】:

如果您可以将Scala 夹在两个 Java 实现之间,那么您可以创建一个 具有所需抽象保护方法的Java 超类,至少在您将所有子类转换为Scala(如果这实际上是您控制的代码)。但我确实希望有更好的方法...

编辑:另一种选择是使用某种字节码重写器,例如annotation processing tool

【讨论】:

  • 这是一个卑鄙的计划,但我见过的最好的!实际上子类在我的控制之下,所以我可以将 getFoo 的实现更改为 public,但这似乎是一个有趣的问题。
猜你喜欢
  • 2015-01-04
  • 2019-10-12
  • 1970-01-01
  • 2021-02-14
  • 2019-08-18
  • 1970-01-01
  • 2022-08-11
  • 2018-06-29
  • 2011-11-29
相关资源
最近更新 更多