我有某處定義了一個通用可變我的控制以外一些遺留Java代碼(即我不能改變其類型):混合Scala和Java:如何獲得一般類型的構造函數參數?
// Java code
Wrapper<? extends SomeBaseType> payload = ...
我接收這種值作爲方法參數在我的代碼中,並希望將它傳遞給Scala case class
(用作具有actor系統的消息),但是不要正確定義這些定義,以至於我至少得不到編譯器警告。
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
這給出了一個編譯器警告 「類型安全:構造器...屬於原始類型......」
斯卡拉case class
被定義爲:
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
我如何定義代碼編寫乾淨的代碼類? (不幸的是,改變了Java Wrapper
類的代碼或參數的類型不是一個選項)
更新澄清有效載荷參數
的原點加爲了比較,在Java中我可以以同樣的方式定義參數作爲變量定義:
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
,並調用它艾科rdingly
// Java code
doSomethingWith(payload)
但我不能實例化例如一個Wrapper對象直接沒有得到「原始類型」警告。在這裏,我需要使用static
helper方法:
static <T> Wrapper<T> of(T value) {
return new Wrapper<T>(value);
}
,並使用該靜態輔助實例化一個Wrapper
對象:
// Java code
MyDerivedType value = ... // constructed elsewhere, actual type is not known!
Wrapper<? extends SomeBaseType> payload = Wrapper.of(value);
解決方案
我可以添加一個類似的helper方法到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
}
,並使用這個從Java實例化ScalaMessage
類W/O問題:
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
除非有人想出了一個更好的解決方案,我將提取這是一個答案......
謝謝!
不會工作,因爲我實際上有一個類型爲'Wrapper <?的方法參數?擴展了Java中的SomeBaseType>,它傳入我們正在討論的代碼塊中。我會相應更新原始問題。 –
我做了一個更新,檢查它。 –