2012-03-01 9 views
16

मैंने ओरेकल ओटीएन वर्चुअल इवेंट: जावा एसई और जावाएफएक्स 2.0 (28 फरवरी 2012) देखा और नए हीरे ऑपरेटर (Map<String, List<String>> myMap = new HashMap<>(); चीज) के बारे में बात करते हुए स्पीकर ने उल्लेख किया कि यह किसी भी विचार से लागू करने के लिए आसान नहीं था, क्योंकि यह एक साधारण टोकन प्रतिस्थापन नहीं है।जावा 7 हीरा ऑपरेटर: इसे कार्यान्वित करना क्यों मुश्किल था?

मेरा प्रश्न है क्यों? इसे वैरिएबल की घोषणा से स्ट्रिंग लेने और इसे हीरा ऑपरेटर में डालने के रूप में क्यों लागू नहीं किया जा सकता है?

+3

उपरोक्त। इसके लिए हमें एक ऑपरेटर की आवश्यकता क्यों है? – Croo

उत्तर

14

मैंने इसे लागू नहीं किया है, इसलिए मैं केवल अनुमान लगा सकता हूं।

लेकिन आमतौर पर कारण यह है कि ये चीजें अधिक जटिल हैं, ऐसा लगता है कि पहला निरीक्षण केवल सबसे आम (या सबसे प्रचारित) उपयोग केस को देखता है। इस मामले में यह आपने उल्लेख किया है। सिद्धांत में जो वास्तव में निर्दिष्ट करना आसान होना चाहिए और इसे एक कंपाइलर में कार्यान्वित करना आसान होना चाहिए।

हालांकि, हीरा ऑपरेटर (जो, एक ऑपरेटर तकनीकी रूप से नहीं है जिस तरह से) के रूप में अच्छी तरह से अलग अलग तरीकों से इस्तेमाल किया जा सकता:

someMethodWithGenericArguments(new HashMap<>()); 
new SomeGenericClass(new HashMap<>()); 
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter 

उन मामलों के लिए एक सरल टोकन प्रतिस्थापन स्पष्ट रूप से अब काम नहीं करता है, तो आप वास्तविक प्रकार के विश्लेषण से वास्तविक प्रकार की अनुमान की आवश्यकता है (यानी यह एक साधारण टोकन प्रतिस्थापन के रूप में एक पूरी तरह से अलग अमूर्त स्तर पर है)।

+0

धन्यवाद, मैं देखता हूं कि ये वास्तव में अधिक जटिल स्थितियां हैं। पहला मामला सवाल उठता है कि क्या होगा यदि 'कुछ विधि WithGenericArguments() '˙Map <स्ट्रिंग, स्ट्रिंग> ˙ और' मानचित्र <इंटीजर, इंटीजर> 'के साथ अधिभारित है .. इस मामले में हीरा सेशन। मुझे पूरी तरह से अस्पष्ट लगता है .. – jabal

+0

@jabal: इसे आजमाएं! चूंकि 'मानचित्र <स्ट्रिंग, स्ट्रिंग>' और 'मानचित्र <इंटीजर, इंटीजर>' के पास एक ही मिरर ('मानचित्र') है, इसलिए आपके पास एक ही विधि के उन दो ओवरराइड नहीं हो सकते हैं। –

2

कुछ ऐसा जो जावा नहीं करता है (जो कई भाषाओं में है) उपयोग के आधार पर अंतर्निहित प्रकार है। यानी जावा इसका उपयोग करने के तरीके के आधार पर एक आवश्यकता प्रकार का संकेत नहीं देता है।

उदा

Type a = b; 

a के प्रकार और b के प्रकार के स्वतंत्र हैं और कोई मान्यताओं b के बारे में a के प्रकार के आधार बना रहे हैं।

MethodHandles इसका समर्थन करने के संकेत दिखा रहे हैं। वापसी प्रकार का उपयोग संदर्भ पर आधारित हो सकता है, लेकिन यह एक रनटाइम सुविधा है।

निष्कर्ष में, मेरी धारणा है; जावा में कार्यान्वित करना मुश्किल था क्योंकि भाषा किसी भी तरह का समर्थन नहीं करती थी। यदि भाषा हर समय इस तरह की सुविधा का उपयोग करती है, तो लेने का दृष्टिकोण समझा जाएगा (इसे कैसे काम करना चाहिए) के एक spec को परिभाषित करने की अवधि में और संकलक में उपकरण द्वारा समर्थित है।

+3

आश्चर्यजनक रूप से पर्याप्त, * विधि कॉल * के जेनेरिक प्रकार तर्कों के लिए संकलक * पहले से ही समर्थित प्रकार अनुमान। लेकिन * ऑब्जेक्ट इंस्टेंटेशन * के लिए यह सुविधा केवल डायमंड ऑपरेटर के साथ जोड़ा गया था। –

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