2009-06-15 3 views
8

की तुलना में स्कैला जेनेरिक मैं स्कैला जेनरिक के कार्यान्वयन विवरण के बारे में सोच रहा हूं।सी #

class Foo<T1>{} 
class Foo<T1, T2>{} 

स्काला में हालांकि एक ही बात के रूप में

class Foo0[T1]{} 
class Foo1[T1, T2]{} 

सूचना कैसे वर्ग के नाम एक से अधिक सामान्य मापदंडों के लिए परिवर्तित किया जाना मजबूर किया जाता है घोषित करना होगा: के रूप में सी # में एक एक वर्ग घोषणा कर सकते हैं। क्या कोई कारण है कि स्काला ने सी # एक के बजाय इस मार्ग पर जाने का फैसला किया जो मुझे लगता है कि यह अधिक सुरुचिपूर्ण है? मुझे पता है कि यह शायद एक बहुत छोटा नाइटपिक है, लेकिन मैं तर्क के रूप में बहुत उत्सुक हूँ।

+0

सिर्फ रिकॉर्ड के लिए, उन '{} 'को स्कैला में आवश्यक नहीं है। –

उत्तर

24

मुझे पता है कि जॉन स्कीट का जवाब स्वीकार कर लिया गया है, लेकिन यह बिल्कुल सही नहीं है। यह जेवीएम इतना नहीं है जो एक सीमा को मजबूर करता है क्योंकि यह जावा भाषा है। स्कैला के पास जावा से जितना संभव हो सके आसानी से कॉल करने योग्य होने का एक डिज़ाइन लक्ष्य है और जावा में टाइप पैरामीटर एआरटी के आधार पर क्लास नाम ओवरलोड करने की कोई अवधारणा नहीं है। उदाहरण के लिए, JVM पर टाइप पैरामीटर के आधार पर ओवरलोडिंग को लागू करने का एक आसान तरीका नाम मैंगलिंग के साथ होगा। हालांकि उस नाम को मैंगलिंग को जावा पर दिखाना होगा और बदसूरत होगा। आपके उदाहरण में, एक काल्पनिक स्कैला दो वर्गों, Foo_ $ 1 और Foo_ $ 2 संकलित कर सकता है। स्कैला उस उलझन को अदृश्य बना सकता है। हालांकि, एक जावा प्रोग्रामर उस सभी कुरूपता को देखेगा।

+3

मुझे पूरा यकीन है कि सी # वैसे भी है। Foo का प्रकार का नाम Foo'1 होगा। –

4

यह आंशिक रूप से जावा के समान प्रतिबंधों के कारण हो सकता है। जैसा कि मैं इसे समझता हूं, स्कैला अधिकतर जेवीएम पर उपयोग किया जाता है, जहां आप आमदनी द्वारा जेनेरिक प्रकारों को अधिभारित नहीं कर सकते हैं।

यह जेनरेट के लिए Scala uses type erasure भी है, यहां तक ​​कि .NET पोर्ट में भी। (एक ही लेख कहा गया है कि स्काला से काफी पहले जावा वास्तव में था, इसलिए भी जावा अगर इस समर्थन किया जेनरिक था, कोई गारंटी नहीं कि स्काला होता नहीं है -। वे कुछ हद तक ही सीमित थे, जब वे पहली फीचर डिजाइन)

+0

JVM को chages से बचने के लिए केवल एक चालाक (अधिक या कम) हैक मिरर टाइप नहीं किया गया था? यदि ऐसा है, तो रनटाइम पर जेनेरिक का समर्थन करने के लिए स्कैला को JVM में समान परिवर्तनों की आवश्यकता नहीं होगी? मुझे लगता है कि उस संबंध में जावा की तुलना में स्कैला बहुत बेहतर नहीं है। – Joey

+0

यह तब तक होगा जब तक कि प्रत्येक छिपे हुए क्षेत्र में कुछ प्रकार की जानकारी छिपी हुई फ़ील्ड या कुछ ऐसा न हो। रनटाइम में "उचित" जेनेरिक जैसे कुछ जोड़ना निश्चित रूप से बहुत मुश्किल है जो उनका समर्थन नहीं करता है। –

+4

ध्यान दें कि स्केल जेनरिक उच्च प्रकार की हो सकती है, .NET के विपरीत। मैं नहीं देखता कि उन्हें बिना किसी त्रुटि के .NET में कैसे जोड़ना है। –

2

मुझे लगता है यह जावा पर आसान मैपिंग के लिए किया जाता है, जिसमें एक ही प्रतिबंध है।

कुछ नाम मैंगलिंग करना संभव होगा, लेकिन जावा के साथ बातचीत को और अधिक कठिन बनाने की कीमत पर। मेरे विचार में उन्होंने सही निर्णय लिया।