我有一个已移植到 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
}
编译器提示说
Cannot reduce the visibility of the inherited method ...
现在我明白了,因为它的规则略有不同,Scala 倾向于在编译器而不是字节码中强制可见性,因此 getFoo 在 javap 类中被标记为 public。但
protected[packagename] def getFoo()
仍然不会生成 pukka (Java) 保护方法,尽管我认为可见性应该是相同的。
有什么方法可以说服 Scala 编译器发出 Java 认为 protected 方法吗?
最佳答案
如果您可以将 Scala 夹在两个 Java 实现之间,那么您可以创建一个只有所需抽象保护方法的 Java 父类(super class),至少在您将所有子类转换为 Scala 之前(如果这实际上是您控制的代码)。但我确实希望有更好的方法......
编辑 :另一种选择是使用某种字节码重写器,例如 annotation processing tool .
关于scala - 我可以在 Scala 中创建具有 Java 保护访问权限的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110799/