मुझे यह एक जोशुआ ब्लोच द्वारा दी गई Google I/O गूढ़ व्यक्ति से मिली है। यहाँ कोडजावा जेनरिक प्रकार विधि पैरामीटर का मिटा
public class Glommer<T> {
String glom(Collection<?> obj){
String result = "";
for(Object o : obj){
result += o;
}
return result;
}
int glom(List<Integer> ints){
int result = 0;
for(int i : ints){
result += i;
}
return result;
}
public static void main(String args[]){
List<String> strings = Arrays.asList("1", "2", "3");
System.out.println(new Glommer().glom(strings));
}
इस मुख्य विधि एक अपवाद फेंकता है क्योंकि new Glommer
एक कच्चे प्रकार है और इसलिए Glommer
में सभी जेनरिक मिटा दिया जाता है, इसलिए यह String glom(Collection<?> obj)
बजाय int glom(List<Integer> ints)
बुला समाप्त होता है।
मेरा प्रश्न है, भले ही मैं बुलाया glom()
रूप new Glommer<Integer>().glom(strings)
यह int glom(List<Integer> ints)
विधि नहीं बुलाना चाहिए विलोपन टाइप करने के लिए कारण के बाद से, इस विधि को प्रभावी ढंग से int glom(List ints)
है और strings
प्रकार List
नहीं Collection
की है, है?
मैं कहूंगा कि कंपाइलर निष्पादित करने के तरीके के हस्ताक्षर को निर्धारित करता है, लेकिन निष्पादित करने की विधि को वास्तविक ऑब्जेक्ट प्रकार का उपयोग करके रनटाइम पर चुना जाता है। – tcb
@tcb मैंने एक उदाहरण जोड़ा, इसे आजमाएं। – WilQu
मैं समझता हूं कि आप क्या कहना चाहते हैं और इस उदाहरण में आप सही हैं, लेकिन मेरे शब्द एक सामान्य मामले के बारे में थे जहां आप ओवरराइड विधियों के साथ व्युत्पन्न कक्षा प्राप्त कर सकते हैं। – tcb