2008-09-08 13 views
7

मुझे Differences in Generics पर चर्चा पसंद आई, और यह सोच रहा था कि क्या ऐसी कोई भाषाएं थीं जो विशेष रूप से अच्छी तरह से इस सुविधा का उपयोग करती थीं।क्या ऐसी कोई भाषाएं हैं जो जेनेरिक _well_ को लागू करती हैं?

मैं वास्तव में चीजें हैं जो Foo के लिए Liskov-substitutable हैं की एक List के लिए जावा के List<? extends Foo> नापसंद करते हैं। List<Foo> क्यों कवर नहीं कर सकता?

और ईमानदारी से, Comparable<? super Bar>?

मैं भी मेरी के जीवन के लिए याद नहीं कर सकते तुम क्यों जेनरिक के एक सरणी वापस कभी नहीं करना चाहिए:

public T[] getAll<T>() { ... } 

सी ++ में मैंने कभी नहीं पसंद आया टेम्पलेट्स, लेकिन वह था ज्यादातर क्योंकि compilers में से कोई भी कभी भी कर सकता है उनके लिए एक दूरस्थ अर्थपूर्ण त्रुटि संदेश थूकना। एक बार मैंने वास्तव में संकलन करने के लिए कुछ प्राप्त करने के लिए make realclean && make 17 बार किया था; मैंने कभी नहीं पता था कि 17 वें समय आकर्षण क्यों था।

तो, वास्तव में अपनी पालतू भाषा में जेनेरिक का उपयोग करके पसंद करता है?

+0

समुदाय विकी होना चाहिए। –

+0

मेरे लिए अच्छा लगता है :) –

उत्तर

14

हास्केल टाइप-कन्स्ट्रक्टर पैरामीटरेशन (जेनेरिक, या पैरामीट्रिक पॉलिमॉर्फिज्म) को अच्छी तरह से लागू करता है। तो स्कैला करता है (हालांकि इसे कभी-कभी हाथ-पकड़ने की ज़रूरत होती है)।

इन दोनों भाषाओं में उच्च-प्रकार के प्रकार हैं (ए.के.ए.ए.ए. प्रकार के प्रकार के कन्स्ट्रक्टर, या टाइप-कन्स्ट्रक्टर पॉलिमॉर्फिज्म, या उच्च-ऑर्डर पॉलीमोर्फिज्म)।

यहाँ देखें: Generics of a Higher Kind

7

ओह, अंग्रेजी भी अच्छी तरह से जेनरिक को लागू नहीं करता है। :)

मेरी पूर्वाग्रह सी # के लिए है। मुख्य रूप से क्योंकि मैं वर्तमान में उपयोग कर रहा हूं और मैंने उन्हें अच्छे प्रभाव के लिए उपयोग किया है।

1

मैं .Net (VB.Net) का उपयोग करता हूं, और जेनेरिक का उपयोग करने में कोई समस्या नहीं है। यह ज्यादातर दर्द रहित है।

Dim Cars as List(Of Car) 
Dim Car as Car 

For Each Car in Cars 
... 
Next 

कभी नहीं, सामान्य संग्रह का उपयोग कर किसी भी समस्या नहीं थी, हालांकि मैं अब तक के रूप में किसी भी वस्तुओं है कि अपने दम पर जेनरिक का उपयोग डिजाइन करने के लिए नहीं गए हैं।

7

मुझे लगता है कि जावा में जेनेरिक वास्तव में बहुत अच्छे हैं। List<Foo>List<? extends Foo> से भिन्न है इसका कारण यह है कि FooBar का उप प्रकार है, List<Foo>List<Bar> का उप प्रकार नहीं है। यदि आप List<Foo> ऑब्जेक्ट को List<Bar> के रूप में देख सकते हैं, तो आप Bar ऑब्जेक्ट्स जोड़ सकते हैं, जो चीजों को तोड़ सकता है। किसी भी उचित प्रकार प्रणाली के लिए इसकी आवश्यकता होगी। जावा Bar[] के उप प्रकार के रूप में Foo[] का इलाज करने से आपको दूर जाने देता है, लेकिन यह प्रदर्शन को कम करने, रनटाइम चेक को मजबूर करता है। जब आप इस तरह के एक सरणी को वापस करते हैं, तो यह संकलक के लिए यह पता चलता है कि रनटाइम चेक करना है या नहीं।

मुझे निचली सीमाओं (List<? super Foo>) का उपयोग करने की आवश्यकता नहीं है, लेकिन मुझे लगता है कि वे सामान्य मूल्यों को वापस करने के लिए उपयोगी हो सकते हैं। covariance and contravariance देखें।

हालांकि, मैं निश्चित रूप से अत्यधिक वर्बोज़ सिंटैक्स और भ्रमित त्रुटि संदेशों के बारे में शिकायतों से सहमत हूं।ओकैमल और हास्केल जैसे प्रकार के अनुमान वाले भाषाएं शायद आपके लिए यह आसान बनाती हैं, हालांकि उनके त्रुटि संदेश भी भ्रमित हो सकते हैं।

+0

मैं ज्यादातर आपके साथ सहमत हूं, लेकिन मेरे पास दो चीजें हैं: टाइप एरर कभी-कभी दर्द हो सकता है, और आप जेनेरिक के साथ आदिम प्रकारों का उपयोग नहीं कर सकते हैं। –

3

मैं सूची में ओकैमल जोड़ूंगा, जिसमें वास्तव में जेनेरिक जेनेरिक है। मैं मानता हूं कि हास्केल के प्रकार के वर्ग वास्तव में अच्छी तरह से किए जाते हैं, लेकिन यह थोड़ा अलग है कि हास्केल के पास कोई ओओ अर्थशास्त्र नहीं है, लेकिन ओकैमल ओओ का समर्थन करता है।

0

मुझे लगता है कि सी # और वीबी.नेट जेनेरिक के साथ एक अच्छा काम करते हैं।

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

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