2017-03-21 10 views
5

यह Java Tutorials कैसे परिभाषित प्रकार निष्कर्ष है:प्रकार निष्कर्ष जावा गैर जेनरिक में लागू करें

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

नीचे, यह जेनेरिक के सभी उदाहरणों का उपयोग करके प्रकार अनुमान को बताता है।

मेरे प्रश्न हैं: जावा में टाइप अनुमान केवल तभी लागू होता है जब जेनेरिक खेलते हैं? यदि नहीं, तो उदाहरण या दो उपयोगी होंगे जहां हम इसे देख सकते हैं?

+0

दिलचस्प सवाल। लेकिन मुझे लगता है कि जावा के वर्गों की बहुलक प्रकृति के कारण प्रत्येक बार एल्गोरिदम का उपयोग किया जाता है। – KarelG

उत्तर

2

लैम्बडास में आपको तर्क प्रकार निर्दिष्ट करने और प्रकारों को वापस करने की आवश्यकता नहीं है, वे स्वचालित रूप से कम हो जाते हैं। उदाहरण के लिए:

listOfStrings.stream(). 
     map((aString) -> { 
       //do something 
      anObject anobject = new anObject(); 
      return anobject;}) 

     .collect(Collectors.toList()); 

लौटे सूची के प्रकार List<anObject> है, और मैं के रूप में यह listOfStrings प्रकार के आधार पर infered जाता है कि aString प्रकार स्ट्रिंग की है निर्दिष्ट करने के लिए नहीं था।

1

मेरा पहला विचार था: "जरूरी नहीं"; चूंकि कंपाइलर को तब से मिलान करने के तरीके का चयन करने के लिए विधि तर्कों का विश्लेषण करना होगा जब ओवरलोडिंग स्थान लेता है (जैसे समझने में कि कौन सा foo (int) बनाम foo (long) बनाम foo (double) कुछ foo(x) के लिए बुलाया जाना चाहिए)।

लेकिन अच्छी तरह से, यह लगभग शब्दावली है। तो तथ्य यह है कि सही अधिभारित विधि का पता लगाने के लिए "कुछ गणना" की आवश्यकता नहीं है इसका मतलब यह नहीं है कि "जावा पिता" सोचते हैं कि इन गणनाओं में "टाइप अनुमान" के लिए खाता है।

इसके विपरीत: जावा भाषा विनिर्देश के पास type inference के बारे में एक संपूर्ण अध्याय है; और जब आप बारीकी से अध्ययन करते हैं, तो यह सामान्य प्रकार और भेड़ के बच्चे के बारे में "केवल" होता है।

तो उत्तर ऐसा लगता है: जब जावा लोग उस शब्द का उपयोग करते हैं, यह केवल जेनेरिक/लैम्बडास के बारे में है; और अन्य स्थितियों के बारे में नहीं जहां तर्क प्रकारों का विश्लेषण करने की आवश्यकता है।

+0

प्रिय डाउनवॉटर: एक टिप्पणी मदद मिलेगी। – GhostCat

+0

कृपया संदर्भ दें कि विधि अधिभार की आवश्यकता प्रकार संदर्भ है ताकि मैं इसे स्वीकार कर सकूं। –

+0

मैंने अभी किया है, लेकिन अन्य उत्तरों के निष्कर्षों पर और अधिक आ रहा है। – GhostCat

1

यह एक वास्तविक गैर-जेनेरिक वातावरण में प्रकार अनुमान लगाने के लिए अधिक समझ में नहीं आता है, अन्यथा आप और संकलक पहले से ही इस प्रकार को जानते हैं और किसी भी हस्तक्षेप के लिए कंपाइलर की आवश्यकता नहीं है। हालांकि बंद उदाहरण उदाहरण के लिए मुझे Target Types मिल सकता है।डॉक्स से

एक तरीका है जिसके इस

void processStringList(List<String> stringList) { 
    // process stringList 
} 

के रूप में घोषित किया जाता है ले लो और तुम Collections.emptyList() के बाद से इस

processStringList(Collections.emptyList()); 

से कॉल करने की एक List<Object लौटा रहा है, तो कोई लक्ष्य निर्दिष्ट किया जाता है यह एक फेंक होगा त्रुटि

List<Object> cannot be converted to List<String> 

यहां संकलक abl नहीं है ई List<> के लिए प्रकार तर्कों में हस्तक्षेप करने के लिए। आपको स्पष्ट रूप से लक्ष्य प्रकार

processStringList(Collections.<String>emptyList()); 

हालांकि जेडीके 8 के साथ अब और आवश्यक नहीं है। Oracle docs Type Inference

यह लंबे समय तक जावा SE 8. क्या है लक्ष्य प्रकार इस तरह के विधि processStringList को तर्क के रूप में विधि तर्क, शामिल करने के लिए विस्तार किया गया है की धारणा में आवश्यक नहीं है। इस मामले में, प्रक्रिया स्ट्रिंगलिस्ट को प्रकार सूची की एक तर्क की आवश्यकता होती है। विधि संग्रह .emptyList सूची का एक मूल्य देता है, इसलिए लक्ष्य प्रकार के सूची का उपयोग करके, कंपाइलर अनुमान लगाता है कि टाइप तर्क टी में स्ट्रिंग का मान है। इस प्रकार, जावा SE 8 में, निम्नलिखित बयान संकलित:

तो पिछले उदाहरण में संकलक एक List<String>Collections.emptyList() से प्राप्त करने के लिए प्रकार तर्क हस्तक्षेप करता है।

+0

टाइप अनुमान टाइप प्रकार का उपयोग करता है। लक्ष्य प्रकार टाइप अनुमान के लिए एक वैध उदाहरण नहीं है। 'अनुमान एल्गोरिदम केवल आमंत्रण तर्कों, लक्ष्य प्रकारों, और संभावित रूप से एक स्पष्ट अपेक्षित रिटर्न प्रकार का उपयोग करता है।' Https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html –

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