2010-10-22 10 views
7

आप जानते हैं, जैसे सीएलआर करता है। क्या कोई भी रनटाइम जेनेरिक जानकारी की कमी को स्वीकार कर रहा है, यह एक समस्या है, और इसे हल करने के लिए काम कर रहा है?क्या रनटाइम पर जेनेरिक का समर्थन करने के लिए JVM के लिए कोई योजना है?

+4

यह एक समस्या क्यों है? – hvgotcodes

+3

@hvgotcodes: प्राइमेटिव्स के साथ उपयोग नहीं किया जा सकता है, कोई बेहतर दक्षता नहीं, प्रतिबिंब, निम्न प्रकार की सुरक्षा, और कई, कई कोने-मामलों के साथ उपयोग नहीं कर सकते हैं। –

+2

@hvgotcodes: आमतौर पर दिन-प्रतिदिन के विकास में यह एक बड़ी समस्या नहीं है, लेकिन यह निश्चित रूप से कुछ प्रकार के पुस्तकालयों के लिए चीजों को मुश्किल बनाता है और इस तरह वास्तव में रनटाइम पर ऐसी जानकारी प्राप्त करने में सक्षम होना चाहिए। उदाहरण के लिए, गुइस लें, जिसे 'टाइप लिटरल' और इसकी उप-प्रकार की चाल जैसी चीजों की जानकारी के अभाव के आसपास काम करने की आवश्यकता है। अन्य प्रकार के पुस्तकालय हैं जो समान रूप से लाभान्वित होंगे। – ColinD

उत्तर

3

जावा के डिजाइनरों ने पिछड़े संगतता (बाइटकोड स्तर पर) को बनाए रखने के लिए इस समाधान का चयन किया। तब से, वहां और भी जावा कोड है, इस प्रकार पिछड़े संगतता को तोड़ने से कभी भी खराब परिणाम होंगे। तो मुझे संदेह है कि वे इसके बारे में अपने दिमाग बदल देंगे।

void foo(List<String> strings) { ... } 
void foo(List<Integer> ints) { ... } 

भी:

+1

उन्होंने उल्लेख किया है कि यदि संभव हो तो वे भविष्य में ऐसा करना चाहते हैं, और एओबोब का उल्लेख है कि पिछड़े संगतता को तोड़ने के बिना ऐसा करने का कोई तरीका हो सकता है ... मुझे नहीं लगता कि इसे अस्वीकार कर दिया जा सकता है। – ColinD

+0

@ColinD, निश्चित रूप से कुछ भी अस्वीकार नहीं किया जा सकता है :-) ध्यान दें कि @ एयोबोब का उद्धरण टाइप _ संशोधन को _optional_ सुविधा के रूप में प्रस्तावित करता है (माना जाता है कि केवल नए कोड के लिए)। –

+0

@ सीपीआर को किसी भी पिछड़ा संगतता के मुद्दों का सामना नहीं करना पड़ा जब जेनेरिक .NET 2.0 में लागू किए गए थे ... इस संबंध में जेवीएम को और अधिक समस्याग्रस्त बनाता है? –

2

यह एक समस्या (टिप्पणियों से अपने प्रश्न का)

ठीक है, उदाहरण के लिए विचार है कि इस तरह की एक विधि को ओवरलोड क्यों नहीं कर पा रहा है हालांकि वास्तव में यह अनुमति देने के लिए समझ में आता है। (मुख्य कारण यह आज काम नहीं करता है, क्योंकि यह होता है, जब बाईटकोड को संकलित, foo(List strings) और foo(List ints) की तरह लग रही है।)

वहाँ JVM कार्यावधि में जेनरिक का समर्थन करने के लिए कोई योजना है?

reified जेनेरिक्स

वर्तमान में, जेनरिक, विलोपन का उपयोग करके लागू जिसका अर्थ है:

this page के अनुसार यह कम से कम नहीं जावा 7 के लिए पाइप लाइन में है

कि जेनेरिक प्रकार की जानकारी रनटाइम पर उपलब्ध नहीं है, जो किसी प्रकार का कोड लिखना मुश्किल बनाती है। जेनेरिक पुराने गैर-जेनेरिक कोड के साथ पिछड़ा संगतता का समर्थन करने के लिए इस तरह कार्यान्वित किए गए थे। संशोधित जेनरिक जेनेरिक प्रकार की जानकारी रनटाइम पर उपलब्ध कराएंगे, जो विरासत गैर-जेनेरिक कोड को तोड़ देगा। हालांकि, नील Gafter ने केवल निर्दिष्ट होने पर प्रकारों को फिर से लागू करने का प्रस्ताव दिया है, ताकि पिछड़े संगतता को तोड़ न सके।

लिंक

1

मैं किसी को (संभवतः मार्क रेनहोल्ड) का मानना ​​है कि इस साल JavaOne में कहा है कि वे में जावा में जेनरिक वस्तु के बारे में जैसे सोचना की कोशिश कर सकते भविष्य। यह निश्चित रूप से जावा 9 की तुलना में जल्द से जल्द नहीं होगा, और काम करने के लिए कई संभावित मुद्दों के साथ एक बड़ा बदलाव होगा।

0

समस्या आंशिक रूप से हल के बिना JVM में परिवर्तन हो सकता है: जो सामान्य मापदंडों के लिए रन-टाइम प्रकार की जानकारी पकड़ स्काला में (JVM पर के रूप में अच्छी तरह से चल) आप तथाकथित Manifests जोड़ सकते हैं। मुझे लगता है कि इस समाधान को जावा के लिए बहुत अधिक परेशानी के बिना अनुकूलित किया जा सकता है। यह सही नहीं है, लेकिन संभवतः "वास्तविक चीज़" के रूप में लागू करना बहुत आसान है।

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

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