मैं कुछ विरासत जावा कोड है कि मेरे नियंत्रण के बाहर कहीं एक सामान्य payload
चर को परिभाषित करता है है (यानी मैं अपने प्रकार नहीं बदल सकते):मिक्सिंग स्कैला और जावा: सामान्य रूप से टाइप किए गए कन्स्ट्रक्टर पैरामीटर को कैसे प्राप्त करें?
// Java code
Wrapper<? extends SomeBaseType> payload = ...
मैं एक विधि पैरामीटर के रूप में इस तरह के एक payload
मूल्य प्राप्त मेरे कोड में और इसे स्कैला case class
(एक अभिनेता प्रणाली के साथ संदेश के रूप में उपयोग करने के लिए) पर पास करना चाहते हैं, लेकिन परिभाषाएं सही नहीं हैं कि मुझे कम से कम एक कंपाइलर चेतावनी नहीं मिलती है।
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
यह एक संकलक चेतावनी देता है "प्रकार की सुरक्षा: contructor ... कच्चे प्रकार के अंतर्गत आता है ..."
स्काला case class
के रूप में परिभाषित किया गया है:
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
मैं कैसे परिभाषित कर सकते हैं केस क्लास जैसे कोड स्पष्ट रूप से संकलित करता है?
अपडेट किया गया पेलोड पैरामीटर
के मूल स्पष्ट करने के लिए जोड़ा गया तुलना के लिए (दुर्भाग्य से, जावा Wrapper
वर्ग के कोड या payload
पैरामीटर का प्रकार बदलने एक विकल्प नहीं है), जावा में मैं सिर्फ एक ही तरह से एक पैरामीटर के रूप में परिभाषित कर सकते हैं payload
चर परिभाषित किया गया है:
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
और यह acco फोन rdly
// Java code
doSomethingWith(payload)
लेकिन मैं तत्काल नहीं कर सकता "कच्चे प्रकार" चेतावनी के बिना सीधे एक रैपर ऑब्जेक्ट।
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);
समाधान
मैं एक ऐसी ही सहायक विधि जोड़ सकते हैं यहाँ, मैं एक static
सहायक विधि का उपयोग करने की आवश्यकता है एक स्कैला साथी वस्तु के लिए:
// 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/ओ समस्याओं का दृष्टांत को जावा से इस का उपयोग करें:
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
जब तक किसी को एक और अधिक सुरुचिपूर्ण समाधान के साथ आता है, मैं इस एक जवाब के रूप निकाल देंगे ...
धन्यवाद !
काम नहीं करेगा क्योंकि मेरे पास वास्तव में 'रैपर <प्रकार' का विधि पैरामीटर है? कुछबेस टाइप टाइप>> जावा में जो कोड के ब्लॉक में पास हो गया है, हम चर्चा कर रहे हैं। मैं तदनुसार मूल प्रश्न अपडेट करूंगा। –
मैंने एक अद्यतन किया, इसे जांचें। जावा/स्कैला प्रकार सिस्टम के विस्तृत स्पष्टीकरण के लिए –