मैं नहीं पूरी तरह से स्वीकार किए जाते हैं जवाब है, जिसमें यह कहते हैं के साथ सहमत:
इस तरह के एक मामले में, आप स्पष्ट रूप सेद्वारा संकलक थोड़ी सी मदद देने की जरूरत हैआपके द्वारा अपेक्षित रिटर्न प्रकार को इंगित करता है।
यह मेरे लिए सही नहीं है। जैसा कि मैं सामान्य विधि को समझता हूं और अनुमान लगाता हूं, स्क्वायर ब्रैकेट में प्रदान किया गया प्रकार सीधे जेनेरिक विधि के रिटर्न प्रकार को इंगित नहीं करता है। इसके बजाय, टाइप T
जेनेरिक विधि से जुड़े रिटर्न प्रकार, तर्क प्रकार, स्थानीय चर प्रकार हो सकता है।
असल में, अनुमान तंत्र को टाइप करने के लिए धन्यवाद, हमें ज्यादातर मामलों में टाइप पैरामीटर T
निर्दिष्ट करने की आवश्यकता नहीं है (न केवल कुछ स्थितियों में)। आपके उदाहरण में, <T>
को अधिकांश अन्य मामलों में विधि आमंत्रण ObjectGenerator.<T> getObject(objectName)
से सुरक्षित रूप से छोड़ा जा सकता है। ऐसा इसलिए है क्योंकि जेनेरिक विधि के प्रकार T
को से आसानी से अनुमानित किया जा सकता है कि परिणाम असाइन किया जा रहा है, या लौटाया गया है। दूसरे शब्दों में, चूंकि आप विधि आमंत्रण से पहले private T object
घोषित करते हैं, इसलिए T
टाइप T
के रूप में सफलतापूर्वक अनुमानित किया जाएगा।
मेरे दावा a definitive tutorial से निम्न कथन द्वारा समर्थित किया जा सकता है:
प्रकार निष्कर्ष एक जावा संकलक के प्रकार तर्क निर्धारित करने के लिए (या तर्क) प्रत्येक विधि मंगलाचरण को देखने के लिए क्षमता और इसी घोषणा है जो आमंत्रण लागू करता है। अनुमान एल्गोरिदम तर्कों के प्रकार निर्धारित करता है, और यदि उपलब्ध है, तो परिणाम जिस प्रकार परिणाम दिया जा रहा है, या लौटाया गया है। अंत में, अनुमान एल्गोरिदम सबसे विशिष्ट प्रकार खोजने का प्रयास करता है जो सभी तर्कों के साथ काम करता है। कैसे काम करता है के बारे में अनुमान
दो उदाहरण:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
प्रकार T
घोषित समनुदेशिती प्रकार के आधार पर Serializable
के रूप में मान लिया जाता है।
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
प्रकार U
पारित कर दिया तर्क के प्रकार के आधार Integer
के रूप में मान लिया जाता है (अर्थात।, Integer.valueOf(10)
प्रकार Integer
की है)। इसलिए, <Integer>
को ऊपर दिए गए विधि आमंत्रण से सुरक्षित रूप से छोड़ा जा सकता है।
सारांशित करने के लिए, जब तक कि हम सामान्य तर्क के प्रकार पैरामीटर को अपने तर्क प्रकार से टाइप नहीं कर पाएंगे या जिस प्रकार परिणाम दिया जा रहा है या लौटाया गया है (विधि का आविष्कार करते समय), हम प्रकार विनिर्देश को सुरक्षित रूप से छोड़ सकते हैं विधि आमंत्रण से ठीक पहले।
+1 क्योंकि मैंने इसे पहले नहीं देखा था। –
मैं इसके बारे में नहीं पूछ रहा हूं लेकिन कोड की लगभग एक पंक्ति है। मैं विधि हस्ताक्षर बदल सकता हूं '<टी ऑब्जेक्ट> टी getObject (स्ट्रिंग नाम, कक्षा क्लैज) बढ़ाता है - इससे कोई फर्क नहीं पड़ता। ' 'के साथ उस विधि के आमंत्रण के साथ केवल यह एक पंक्ति मुझे –
emka86