我有一个已经移植到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会认为受保护的方法?
答案 0 :(得分:2)
如果你可以在两个 Java实现之间夹分Scala,你可以创建一个只有 具有所需抽象保护方法的Java超类,至少在你将所有子类转换为Scala(如果这实际上是您控制下的代码)。但我希望有更好的方法......
编辑:另一种选择是使用某种字节码重写器,例如annotation processing tool。