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

时间:2011-11-13 09:53:16

标签: scala visibility protected

我有一个已经移植到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类中被标记为public。但

protected[packagename] def getFoo()

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

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

1 个答案:

答案 0 :(得分:2)

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

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