2010-08-20 21 views
5

मैं इस प्रकार एक सामान्य कारखाना बनाने के साथ खेल रहा था:उदाहरण उदाहरण के बिना एक सामान्य उदाहरण बनाने के लिए स्कैला में कोई तरीका है?

trait Factory[T] { def createInstance():T = new T() } 
val dateFactory = new Factory[Date](){} 
val myDate = dateFactory.createInstance() 

'नई टी()' संकलन नहीं करता है, के रूप में टी क्रम तक अनिर्धारित रहता है। मुझे पता है कि मैं इसे कक्षा के उदाहरण में कुछ विधि (यानी बनानाInstance (classOf [date]) में गुजरकर काम करने के लिए प्राप्त कर सकता हूं)

मैं पूछ रहा हूं कि कुछ आत्मनिरीक्षण जादू है जो 'नया टी'() 'ताकि मैं अपना सुपर सरल कारखाना बना सकूं?

उत्तर

10

यह काम करेगा:

class Factory[T : ClassManifest] { 
    def 
    createInstance(): T = 
    (implicitly[ClassManifest[T]]).erasure.newInstance.asInstanceOf[T] 
} 

अगर वर्ग है जिसके लिए यह instantiated है एक डिफ़ॉल्ट (शून्य आर्ग) निर्माता है।

+0

मैं इस उत्कृष्ट उत्तर को एक सुराग के रूप में लेने जा रहा हूं कि इसे एक विशेषता के साथ नहीं किया जा सकता है। –

+0

क्षमा करें, मुझे यह इंगित करना चाहिए था। "लक्षणों में संदर्भ सीमाओं के साथ प्रकार पैरामीटर नहीं हो सकते हैं" (संकलक को छोड़ दें) –

संबंधित मुद्दे