我可以在 Scala 中创建一个具有 Java 保护访问的方法吗?
Posted
技术标签:
【中文标题】我可以在 Scala 中创建一个具有 Java 保护访问的方法吗?【英文标题】:Can I create a method with Java protected access in Scala? 【发布时间】: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 认为受保护的方法?
【问题讨论】:
我会接受权威的“不” 很好的问题。在到达此页面之前,我遵循了完全相同的路径。 【参考方案1】:如果您可以将Scala 夹在两个 Java 实现之间,那么您可以创建一个仅 具有所需抽象保护方法的Java 超类,至少在您将所有子类转换为Scala(如果这实际上是您控制的代码)。但我确实希望有更好的方法...
编辑:另一种选择是使用某种字节码重写器,例如annotation processing tool。
【讨论】:
这是一个卑鄙的计划,但我见过的最好的!实际上子类在我的控制之下,所以我可以将 getFoo 的实现更改为 public,但这似乎是一个有趣的问题。以上是关于我可以在 Scala 中创建一个具有 Java 保护访问的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章