2013-02-20 18 views
28

मैं जावा जेनेरिक सीख रहा हूं और मैं खुद से यह प्रश्न पूछता हूं।जावा जेनेरिक विधि घोषणा

इन दो विधि घोषणाओं के बीच क्या अंतर है?

public static void someMethod(List<? extends Number> numberList); 

और

public static <E extends Number> void someMethod(List<E> numberList); 
+7

दूसरे का उपयोग करके आप अपने 'कुछ विधि के कोड में ई को संदर्भित करने की अनुमति देता है। – Oren

उत्तर

19

बाद में आप someMethod, अर्थात् E के दायरे के भीतर प्रकार के लिए एक संदर्भ है। पूर्व में आप नहीं करते हैं।

0

पहली विधि घोषणा का उपयोग करने से आप सूची में कुछ नया जोड़ने की अनुमति नहीं देंगे। उदाहरण के लिए यह संकलित नहीं होगा।

public static void someMethod(List<? extends Number> numberList, Number number) { 
    numberList.add(number); 
} 

आपको ऐसा करने की अनुमति देता है, जबकि दूसरा:

public static <E extends Number> void someMethod(List<E> numberList) { 
    E number = numberList.get(0); 
    numberList.add(number); 
} 

यह पहला संस्करण के साथ संभव नहीं है: आप की तरह कुछ कर सकते हैं दूसरे संस्करण के साथ

public <T extends Number> static void someMethod(List<T> numberList, T number) { 
    numberList.add(number); 
} 
+0

दूसरे का उपयोग करने के लिए या तो। – ZeDonDino

+0

आप सूची में तत्व जोड़ सकते हैं, जब तक कि तत्व को जोड़ा जाना ई प्रकार या उप-वर्ग का प्रकार हो। –

+0

मैं जावा एसई 6 का उपयोग कर रहा हूं और यह संभव नहीं है। – ZeDonDino

9

मुख्य अंतर यह है कि उत्तरार्द्ध जेनेरिक विधि पूर्व नहीं है।

तो बाद विधि में उदाहरण के लिए आप कुछ इस तरह कर सकते हैं:

public static <E extends MyObject> void someMethod(List<E> someList) { 
    E myObject = someList.iterator().next(); // this can actually lead to errors 
    myObject.doSomething();     // so treat it as an example 
} 

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

की सलाह दी हो, हालांकि यह है कि आप इस तरह के प्रकार तर्क के साथ सामान्य विधि कॉल करना चाहिए:

someClass.<MyArbitraryType>someMethod(someList); 

आप सामान्य तरीकों here का एक अच्छा सिंहावलोकन मिल सकता है।

+1

जावा से 7 में और ऊपर आप इसे 'someClass.somemethod (someList) कह सकते हैं;' मैं विश्वास करता हूं, se7 कंपाइलर एटीएम नहीं है, कृपया पुष्टि करें? – ZeDonDino

+0

इसे इंगित करने के लिए धन्यवाद। –

+1

मेरे पास se7 कंपाइलर एटीएम नहीं है। –

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