2009-02-05 21 views
6

मैं स्काला उपयोग कर रहा हूँ एक जावा इंटरफेस के लिए एक अमीर आवरण को परिभाषित करने के implicits:स्कैला implicits के साथ लपेटा जावा इंटरफेस के कार्यान्वयन के लिए फैक्टरी तरीकों?

class RichThing { def richStuff: Unit = {} } 

साथी वस्तु में मैं अंतर्निहित रूपांतरण और एक apply कारखाने विधि को परिभाषित:

object RichThing { 
    implicit def rich(thing: JavaThing) = new RichThing() 
    def apply() = new RichThing() 
} 
इस के साथ

, मैं इंटरफ़ेस का एक जावा कार्यान्वयन का दृष्टांत और (निहित रूपांतरण के कारण) एक RichThing की तरह उपयोग कर सकते हैं:

new JavaThingImpl().richStuff 

मैं भी एक RichThing कारखाने पद्धति का उपयोग करके (apply विधि की वजह से) बना सकते हैं:

val a = RichThing() 

मैं क्या करना चाहते हैं क्या उसी तरह से अंतरफलक के मनमाने ढंग से जावा कार्यान्वयन का दृष्टांत है। यह काम नहीं करता, के रूप में स्काला तो कार्यान्वयन के एक साथी वस्तु के लिए लग रहा है और नहीं मिल सकता है एक:

val b = JavaThingImpl() // "not found: value JavaThingImpl" 

मैं जावा कार्यान्वयन के लिए एक स्काला साथी वस्तु बना सकते हैं:

object JavaThingImpl { def apply() = new RichThing() } 

लेकिन यह मुद्दा इंटरफेस के किसी भी (विशेष रूप से अज्ञात) कार्यान्वयन के लिए यह काम करना होगा।

क्या इसका एहसास करने का कोई तरीका है? उदाहरण के लिए, RichThing ऑब्जेक्ट में अंतर्निहित रूपांतरण के आधार पर, फ्लाई पर जावा कार्यान्वयन के लिए स्कैला साथी ऑब्जेक्ट्स बनाने के लिए?

या जावा पक्ष से स्कैला साथी ऑब्जेक्ट बनाने के लिए, शायद एक अमूर्त वर्ग में?

उत्तर

3

नहीं, स्कैला में यह संभव नहीं है। यह संभवतः टाइप साउंडनेस समझौता किए बिना भाषा में जोड़ना संभव होगा, लेकिन मैं सवाल करता हूं कि अतिरिक्त जटिलता इसके लायक होगा या नहीं।