2011-03-17 9 views
5

मैं वर्तमान में स्कैला सीख रहा हूं।
इस कोड को क्यों काम नहीं करता:स्कैला जेनरिक - मैं जेनेरिक क्लास के अंदर पैरामीट्रिज्ड ऑब्जेक्ट क्यों नहीं बना सकता?

class GenClass[T](var d : T) { 
    var elems: List[T] = Nil 
    def dosom(x: T) = { 
    var y = new T() 
    y 
    } 
} 

मैं: त्रुटि: वर्ग प्रकार की आवश्यकता है, लेकिन टी
वर y के स्थान पर पाया - नई टी()

है ऐसा इसलिए क्योंकि जावा से मिटाना टाइप करें? क्या इसे हल करने का कोई तरीका है - जेनेरिक फ़ंक्शन के अंदर प्रकार टी का चर बनाओ?

+2

यूप। यह जावा जड़ों से एक प्रतिबंध है। मैं आमतौर पर "कन्स्ट्रक्टर फ़ंक्शन" का उपयोग करता हूं (उदाहरण के लिए सीटीओआर तर्क के रूप में पारित), उदा। '() => टी', लेकिन कुछ और तरीके से निफ्टी तरीके हो सकते हैं। –

+0

हां - मेरे लिए यह समाधान पर्याप्त और सरल दिखता है। –

+0

संभावित डुप्लिकेट [स्कैला में टाइप पैरामीटर द्वारा प्रतिनिधित्व प्रकार के उदाहरण को तत्काल कैसे करें] (http://stackoverflow.com/questions/1305563/how-to-instantiate-an-instance-of-type-represented-by- टाइप-पैरामीटर-इन-स्कैला) –

उत्तर

2

क्योंकि आप यकीन है कि वहाँ हमेशा एक सार्वजनिक, parameterless निर्माता है नहीं हो सकता।

+0

वह भी +1। लेकिन सामान्य मामले में * * * रन-टाइम प्रकार टी जानने के बारे में जानने का तरीका है। स्कैला 2.8 समस्या के इस हिस्से के लिए एक "सामान्य" प्रकट समाधान प्रस्तुत करता है। –

+0

भले ही आपके पास मेनिफेस्ट है, यहां तक ​​कि किसी निर्दिष्ट हस्ताक्षर के साथ एक कन्स्ट्रक्टर नहीं है, या कोई भी; 'टी' एक विशेषता हो सकती है! – Raphael

+0

हां - लेकिन जेनेरिक प्रोग्रामिंग के पीछे विचार सबकुछ हल नहीं करना है (उदाहरण: स्थिरता टाइप करें)। उदाहरण के लिए सी ++ में हम बस टेम्पलेट्स के साथ सबकुछ कर सकते हैं। –

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