2011-11-13 10 views
26

私はScalaに移植したJavaクラスを持っていますが、まだ抽象機能を実装するいくつかのJavaサブクラスを持っています。ScalaでJavaで保護されたアクセスでメソッドを作成できますか?

元のJavaは、Scalaの

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

今とき、私ポートベース延長された

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

を持っていた
class Base { 
    ... 
    protected def getFoo(): Foo 
} 

コンパイラは文句を言い、その

継承されたメソッドの可視性を減らすことができない...


今、私はそのルールが微妙に異なるためからgetfooがあるように、Scalaは、コンパイラではなく、バイトコードでの視認性を強化する傾向があることを理解javap'dクラスでpublicとマークされています。しかし、

protected[packagename] def getFoo() 

でも、私は視認性は同じでなければならないと思うが、プカ(Java)保護メソッドを生成しない。

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

+0

私は信頼できる「いいえ」を受け入れるでしょう –

+0

優秀な質問。私はこのページに達する前にまったく同じ道をたどった。 – ebruchez

答えて

2

あなたは、あなたがだけは、このコードが下に実際にある場合は、(スカラ座へのすべてのサブクラスを変換する少なくともまでは、希望抽象保護されたメソッドを持つJavaスーパークラスを Java実装の間にサンドイッチスカラを作成することができますすることができます場合は、あなたのコントロール)。しかし、よりよい方法があることを願っています...

EDIT:別のオプションは、annotation processing toolのようなバイトコードリライタを使用することです。

+3

それは卑劣な計画ですが、私が見た最高のものです!実際、サブクラスは私の管理下にありますので、getFooの実装をpublicに変更することはできますが、これは興味深い質問です。 –

+0

@DuncanMcGregor:はい、わかります。別のオプションを追加しました... –

関連する問題