我可以在 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 保护访问的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用Scala在Spark中创建DataFrame时出错

如何在 sbt 中创建项目文件

我应该如何在 Scala 中创建 Int 的子类型?

如何在 scala 中创建未初始化的 Dataframe 变量。因此可以在 if else 条件下初始化相同的变量

如何在 Scala 中创建异构数组?

递归在scala中创建字符串的所有旋转