2010-12-15 12 views
6

ここにはいくつかのJavaクラスがあるライブラリがあります。 1つのクラスには、いくつかのprotected staticメソッドがありますが、これはOOPのno-noですが、コードを変更することはできません。前述のJavaクラスをサブクラス化するScalaクラスがあると仮定して、どのように保護された静的メンバーを呼び出すことができますか?Scalaから保護された静的Javaメソッドを呼び出す

+2

スーパークラスメソッドを呼び出すJavaサブクラスを作成するオプションはありませんか?その後、JavaクラスをScalaにアクセスさせることができます。 – Madoc

+0

ああ、はい、私はそのルートに行くことができると思います。ありがとう。ちょっと奇妙に思えますが、それは直接できません! –

+0

Scalaでもっと直接的に可能かもしれませんが、わかりません。だからこそ私はこれをコメントとして投稿し、答えとして投稿しなかったのです。 Scalaには静的継承がないため、明らかに「スーパー」呼び出しは機能しません。おそらく、問題のクラスを拡張するScalaオブジェクトを作成し、 "LibraryClassName.staticMethodName(...)"を呼び出すことで、 "super"の使用を避けることができますか?これがうまくいくかどうかはわかりません。 – Madoc

答えて

19

Frequently Asked Questions - Java Interoperabilityを参照してください:

これは、スカラ座の既知の制限事項です: '静的' メンバーScalaでは の概念がありません。代わりに、ScalaはYクラスの静的メンバー を、シングルトンオブジェクトYのメンバー (クラスYの のコンパニオンオブジェクト)として扱います。このクラスから継承する場合 、1は のアクセスのみに保護することができ、クラス Yのメンバーが、アクセスすることはできません保護されたメンバーオブジェクトYの Scalaはシミュレートすることができます方法はありません

静的Scalaのオブジェクト・モデルの 整合性を損なうことなく保護 基本的な方法では、これは変更されていないので、 に行くことはありません。この の制限を回避するには、 の包含クラス の実装を作成し、すべて をカプセル化したJavaコードで保護された静的内部 クラスにアクセスする必要があります。

より 情報と制限とその回避策の具体例のためticket #1806を参照してください。

+3

「頻繁に」尋ねられる質問は、その存在を気づかせる人がほとんどいないということはめったにありません。 :-) –

+0

母:確かに:) –

+6

JFYI、これは2.10.0-M2に固定されています。 – OlegYch

関連する問題