2015-01-08 11 views
5

गुजर बिना, मैं कोड का टुकड़ा भर में आया है:जेनेरिक्स प्रकार पैरामीटर घिरा हो रही वास्तविक प्रकार

public static <K,V> HashMap<K,V> newHashMap() { 
     return new HashMap<K,V>(); 
} 

और हम इस तरह HashMap का एक उदाहरण बनाने के लिए, इस का उपयोग कर सकते हैं:

Map<String, List<String>> anagrams = newHashMap(); 

अब सवाल यह है कि विधि newHashMap को आवश्यक प्रकार को पारित किए बिना बुलाया जाता है (इस मामले में इसकी (String, List<String>), लेकिन फिर भी जावा सही प्रकार का निर्माण कर रहा है। कैसे?

मैं यहाँ उलझन में हूँ, कैसे K,V प्रकार है कि कोड के बाईं ओर बताया गया है घिरा हो रही है: भी पर गुजर बिना

Map<String, List<String>> 

:

newHashMap(); 

उत्तर

7

यह type inference कहा जाता है। यह

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

यह भी देखें:

6

है ऐसा इसलिए है क्योंकि यह है सही प्रकार का।

ऑब्जेक्ट के प्रकार के हिस्से के रूप में किसी ऑब्जेक्ट के जेनिक्स को देखना आम बात है। यह नहीं। संकलन पूरा होने के बाद वास्तव में जेनेरिक पूरी तरह से हटा दिए जाते हैं। इसे type erasure कहा जाता है।

Map<String,String> वास्तव में केवल Map है। <String,String> भाग केवल यह सुनिश्चित करने के लिए संकलक द्वारा उपयोग किया जाता है कि आप इसे अपने कोड में सही तरीके से उपयोग करते हैं।

2

जावा जेनेरिक जानकारी संग्रहीत नहीं करता है। तो जब आपके कोड के साथ कंपाइलर किया जाता है, तो नक्शा HashMap<Object, Object>() के बराबर होगा। जेनेरिक केवल संकलक को यह सत्यापित करने की अनुमति देते हैं कि आप गलत प्रकारों को फ़ंक्शंस में पास नहीं करते हैं और स्वचालित रूप से (और सुरक्षित रूप से) ऑब्जेक्ट्स को पुनर्प्राप्त करते हैं।

तो आपके द्वारा बनाए गए प्रकार के बावजूद, यह हमेशा Object एस स्टोर करता है।

क्योंकि आपकी विधि (newHashMap()) मानचित्र के साथ कुछ भी नहीं करती है (जैसे तत्व जोड़ने की कोशिश करना। यह फ़ंक्शन आपके द्वारा चुने गए किसी भी सामान्य पैरामीटर के साथ काम करता है। कॉलिंग पक्ष उपयोग किए गए सामान्य प्रकारों को जानता है, इसलिए यह सत्यापित कर सकता है आप इसे में वस्तुओं की गलत प्रकार की दुकान करने की कोशिश नहीं करते।

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