2009-11-03 14 views
10

जब मैं इस प्रकार की सामान्य विधि में आता हूं तो मुझे भ्रमित हो जाता है।सार्वजनिक स्थैतिक <T> टी addandReturn (टी तत्व, संग्रह <T> संग्रह) में <T> का उपयोग क्या है {

public static <T> T addAndReturn(T element, Collection<T> collection){ 
    collection.add(element); 
    return element; 
} 

मैं नहीं समझ सकता क्यों <T> इस विधि में आवश्यक है।

इसके अलावा, जेनेरिक सिंटैक्स का उपयोग करने वाले सामान्य तरीकों और विधियों के बीच क्या अंतर है?

+0

अपना प्रश्न सबमिट करने से पहले प्रारूपण दिशानिर्देश पढ़ें। वे याद करने के लिए बहुत मुश्किल हैं। – Joe

+1

कोड कोड – NDM

+0

@ जो, @ निकी डे मेयर के रूप में अपने कोड उदाहरण स्वरूपण करने का प्रयास करें: मैंने प्रारूपण मुद्दों को ठीक किया और पीएस को हटा दिया। – Asaph

उत्तर

4

विकल्प, टी के बजाए ऑब्जेक्ट का उपयोग करने से, फ़ंक्शन ऑब्जेक्ट को वापस करने का कारण बनता है।

जब यह रिटर्न टी, आप की तरह कुछ कर सकते हैं:

addAndReturn(myElement, col).SomeMethodOfMyElement(); 

तो addAndReturn वस्तु बजाय लौटे, आप का उपयोग करना होगा या तो

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement(); 

जो एक स्पष्ट कलाकारों की जरूरत है, या

addAndReturn(myElement, col); 
myElement.SomeMethodOfMyElement; 

जिसे एक के बजाय दो कथन की आवश्यकता है।


संपादित करें: अब जब कि अपने प्रश्न प्रारूपित हो गया है, मुझे लगता है कि एक पैरामीटर Collection<T> है। उस स्थिति में, जेनेरिक वाक्यविन्यास सुनिश्चित करता है कि

addAndReturn(mySquare, collectionOfCircles); 

रन-टाइम त्रुटि के बजाय संकलन-समय त्रुटि देता है।


संपादित करें: और सिर्फ मामले में अपने प्रश्न <T> सिंटैक्स के बारे में के बजाय सामान्य रूप में जेनरिक के उपयोग के बारे में था: <T> संकलक कि T विधि परिभाषा में इस्तेमाल नहीं कुछ वर्ग टी है बताता है बल्कि विधि के एक विशिष्ट कॉल के लिए जो भी वर्ग "फिट" के लिए प्लेसहोल्डर है।

+1

अंतिम EDIT टिप्पणी के लिए धन्यवाद। यही मेरा सवाल है। मुझे यह जानने की ज़रूरत है। क्या निम्न कोड स्निपेट कंपाइलर में कोई फर्क पड़ता है? यदि हां, तो कैसे? 1. सार्वजनिक स्थिर टी addAndReturn (संग्रह संग्रह) {} 2. सार्वजनिक स्थिर टी addAndReturn (संग्रह संग्रह) {} –

+0

क्षमा करें। मैं इस बार भी मेरे स्वरूपण चूक गया। क्या आप मुझे बता सकते हैं कि मैं इस में अपना कोड कैसे प्रारूपित करूं? –

+0

दूसरे संस्करण में, संकलक सोचता है कि आप एक ऐसा फ़ंक्शन बना रहे हैं जो कक्षा टी। लिटल "टी" लौटाता है, जैसा कि "कक्षा टी {...}" में है। पहले संस्करण में, आप एक ऐसा फ़ंक्शन बना रहे हैं जो * सभी * कक्षाओं के लिए काम करता है: यदि आप एक इंटीजर और संग्रह पास करते हैं, तो यह एक इंटीजर लौटाएगा। – Heinzi

-1

यह एक सामान्य टी है जो वापस आने वाले अधिक ठोस प्रकार के लिए प्लेसहोल्डर है। यदि आपने टी आपूर्ति की है तो वह तत्व है जिसे आप संग्रह में जोड़ रहे हैं।

Collection<int> intCollection = new Collection(); 
int addedInt = addAndReturn(5, intCollection); 
addedInt == 5; 

के बाद से वे सभी टी के बजाय T1 या टी 2 वे वस्तु के एक ही प्रकार के रूप में एक ही प्रकार के स्पष्ट रूप से आवश्यक है होना चाहिए के बाद से समारोह एक सामान्य संग्रह

+2

चूंकि यह जावा है, मुझे आशा है कि आपका मतलब संग्रह है :) – penpen

-1

टी के लिए प्रयोग किया जाता है करने के लिए एक प्रकार जोड़ता हैं polymorphic कारणों, अगर हम ऐसा कह सकते हैं। टी किसी प्रकार का वर्ग प्रकार है।

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

टी आपको अपने सामान्य परिभाषित प्रकारों के लिए इस सामान्य विधि का उपयोग करने की अनुमति देगा, जैसे कि यह मूल्य प्रकार या किसी अन्य प्रकार के लिए करेगा। टी तत्व पैरामीटर में निर्दिष्ट प्रकार बन जाता है।

0

इस विधि एक ही इनपुट element रिटर्न शायद इसलिए है क्योंकि इरादा कार्यान्वयन रास्ता की तरह एक Fluent Interface उपयोग करने के लिए एक अधिक पठनीय एपीआई प्रदान करने के लिए:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff(); 

Here आप जावा जेनरिक कि मैं पूर्ण और शिक्षाप्रद लगता है पर एक अच्छी ट्यूटोरियल है ।

8
> public static <T> T addAndReturn(T 
> element, Collection<T> collection){ 
>  collection.add(element); 
>  return element; } 

<T> (कोण कोष्ठक में) जबकि T सीधे विधि नाम पूर्ववर्ती वापसी प्रकार है, सामान्य प्रकार पैरामीटर के रूप में जाना जाता है। आपके पास एक सामान्य विधि हो सकती है जो सामान्य प्रकार की तुलना में कुछ अन्य प्रकार लौटाती है। शायद आप एक ऐसी विधि चाहते हैं जो एक संग्रह में तत्व जोड़ती है (इसलिए T प्रकार का ऑब्जेक्ट), और जोड़ा गया ऑब्जेक्ट लौटने के बजाय (जो कि T भी होगा), आप चाहते हैं कि वह उस आइटम की अनुक्रमणिका को वापस कर दे संग्रह, जो हमेशा एक int होगा।

उदाहरण विधि हस्ताक्षर जहां वापसी प्रकार सामान्य प्रकार नहीं है:

public static <T> Integer addAndReturn(T element, Collection<T> collection) 

जेनेरिक तरीकों, किसी भी अन्य विधि की तरह, सामान्य प्रकार ही है, किसी अन्य वर्ग प्रकार सहित, किसी भी वापसी प्रकार हो सकता है किसी भी मूल या अंतर्निहित डेटा प्रकार, या शून्य। आप विधि हस्ताक्षर के 2 असंबंधित हिस्सों को भ्रमित कर सकते हैं, सोच रहे हैं कि वे निर्भर हैं, जब वे नहीं हैं। वे इस अर्थ में केवल "आश्रित" हैं कि यदि आप रिटर्न प्रकार के रूप में टी का उपयोग करते हैं, तो वापसी मूल्य का प्रकार आपके द्वारा कॉल साइट पर प्रदान किए जाने वाले सामान्य प्रकार का होता है।

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