我可以在Scala中创建一个具有Java保护访问权限的方法吗?

Dun*_*gor 26 visibility scala protected

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

最初的Java有

public abstract class Base {
    ...
    protected abstract Foo getFoo();
}
Run Code Online (Sandbox Code Playgroud)

这被延长了

public class Fred extends Base {
    ...
    protected Foo getFoo() {
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我将Base移植到Scala

class Base {
    ...
    protected def getFoo(): Foo
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说

无法降低继承方法的可见性......


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

protected[packagename] def getFoo()
Run Code Online (Sandbox Code Playgroud)

仍然没有生成pukka(Java)保护方法,虽然我认为可见性应该是相同的.

有没有办法说服Scala编译器发出一个Java会认为受保护的方法?

Jor*_*dão 2

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

编辑:另一种选择是使用某种字节码重写器,例如注释处理工具

  • 这是一个卑鄙的计划,但却是我见过的最好的计划!实际上子类在我的控制之下,所以我可以将 getFoo 的实现更改为 public,但这确实是一个有趣的问题。 (3认同)