ScalaでJavaで保護されたアクセスを持つメソッドを作成できますか?

私はScalaに移植したJavaクラスを持っていますが、まだ抽象機能を実装しているいくつかのJavaサブクラスがあります。

元のJavaには

public abstract class Base {
    ...
    protected abstract Foo getFoo();
}

それは延長された

public class Fred extends Base {
    ...
    protected Foo getFoo() {
        return foo;
    }
}

今ではBase to Scalaを移植します

class Base {
    ...
    protected def getFoo(): Foo
}

コンパイラは、

継承されたメソッドの可視性を減らすことはできません…


今ではルールが微妙に違うので、Scalaはバイトコードではなくコンパイラで可視性を強制する傾向があるので、getFooはjavap’dクラスでpublicとマークされています。しかし

protected[packagename] def getFoo()

pukka(Java)で保護されたメソッドは生成されませんが、可視性は同じである必要があります。

ScalaコンパイラがJavaが保護されていると考える方法を出すように説得する方法はありますか?

ベストアンサー

2つの
Java実装間にScalaを挟むことができれば、少なくとも、すべてのサブクラスをScalaに変換するまで、必要な抽象保護メソッドをのみ持つJavaスーパークラスを作成できます(ifこれは実際はあなたのコントロール下のコードです)。しかし、もっと良い方法があることを願っています…

EDIT: Another option is to use some kind of
bytecode rewriter, like the annotation processing tool.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です