私は私のコントロール(つまり、私はそのタイプを変更することはできません)の外のどこかの一般的な変数を定義するいくつかの従来のJavaコードがあります:私は、メソッドのパラメータとしてな値を受け取るスカラとJavaを混在させる:一般的に型付けされたコンストラクタパラメータを取得する方法は?
// Java code
Wrapper<? extends SomeBaseType> payload = ...
を私のコードでScala case class
(アクターシステムでメッセージとして使用する)に渡したいのですが、少なくともコンパイラの警告が出ないように定義を正しく取得しないでください。
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
これは、コンパイラの警告 "型の安全性を:コンストラクタは...生のタイプに属している..." を与える
をScalaのcase class
は次のように定義されています
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
どのように定義することができますコードがきれいにコンパイルされるようなケースクラス? 、
を比較のために加えペイロードパラメータ
の起源を明らかにするため更新(悲しい、ジャワWrapper
クラスのコードまたはパラメータの種類を変更するオプションではありません)
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
をしてACCOそれを呼び出す:Javaで私は変数が定義されているとちょうど同じようにパラメータを定義することができますrdingly
// Java code
doSomethingWith(payload)
しかし、私は、例えばインスタンス化することはできませんWrapperオブジェクトは、「生の型」の警告を直接得ずに直接的に処理します。
static <T> Wrapper<T> of(T value) {
return new Wrapper<T>(value);
}
とWrapper
オブジェクトをインスタンス化するために、この静的ヘルパーを使用します:ここで、私はstatic
ヘルパーメソッドを使用する必要が
// Java code
MyDerivedType value = ... // constructed elsewhere, actual type is not known!
Wrapper<? extends SomeBaseType> payload = Wrapper.of(value);
ソリューション
私は同様のヘルパーメソッドを追加することができますScalaコンパニオンオブジェクトへ:
// Scala code
object ScalaMessageHelper {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
new ScalaMessage(payload)
}
object ScalaMessageHelper2 {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
ScalaMessage(payload) // uses implicit apply() method of case class
}
とScalaMessage
クラスW/Oの問題インスタンス化するためのJavaからこれを使用する:
はありがとう...誰かがよりエレガントな解決策を思い付くていない限り、私は答えとしてこれを抽出します
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
を!
ScalaMessage msg = new ScalaMessage(payload);
は、その後、あなたがその生タイプを使用してScalaMessage
をインスタンス化されています
私は実際に 'Wrapper <? '型のメソッドパラメータを持っているので動かないでしょう。 SomeBaseType>をJavaで拡張して、議論しているコードのブロックに渡します。私はそれに応じて元の質問を更新します。 –
私は更新をしました、それを確認してください。 –