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

标签 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
}

编译器提示说

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/

相关文章:

scala - 在 Scala 中重命名 classOf

java - Apache common-email lib - TLS 显示警告

javascript - 基于 bool 值更改 JSP 中控件的可见性

Java protected 方法的歧义类型

postgresql - Joda DateTime 到 java.sql.Timestamp 忽略时区?

Scala:类型推断和子类型/更高种类的类型

android-fragments - view.animate() 第一次不工作,但随后工作

css - 使用 <a href ="#nice"> 隐藏我的 div

java - 关于访问 protected 方法

javascript - 使用 Prototype 的 Class.create 定义私有(private)/ protected 属性和方法