मान लीजिए हम निम्नलिखित सामान्य वर्गअगर हम टाइप एरर लागू करते हैं, तो क्यों ओवरटाइल्ड विधियों को रनटाइम पर कॉल किया जाएगा, और क्यों?
public class SomeType<T> {
public <E> void test(Collection<E> collection){
System.out.println("1st method");
for (E e : collection){
System.out.println(e);
}
}
public void test(List<Integer> integerList){
System.out.println("2nd method");
for (Integer integer : integerList){
System.out.println(integer);
}
}
}
अब मुख्य विधि के अंदर हम निम्नलिखित कोड का टुकड़ा है
SomeType someType = new SomeType();
List<String> list = Arrays.asList("value");
someType.test(list);
someType.test(list)
को क्रियान्वित करने का एक परिणाम के रूप में हम के रूप में हमारे कंसोल में "2 विधि" मिल जाएगा अच्छी तरह से java.lang.ClassCastException
। जैसा कि मैं समझता हूं, दूसरे test
विधि को निष्पादित करने का कारण यह है कि हम SomeType
के लिए जेनेरिक का उपयोग नहीं करते हैं। इसलिए, कंपाइलर कक्षा से सभी जेनेरिक जानकारी को तुरंत हटा देता है (यानी <T>
और <E>
दोनों)। उस दूसरे test
विधि के बाद List integerList
पैरामीटर के रूप में और निश्चित रूप से List
से Collection
की तुलना में बेहतर होगा।
अब विचार है कि मुख्य विधि के अंदर हम निम्नलिखित कोड है झलकी
SomeType<?> someType = new SomeType<>();
List<String> list = Arrays.asList("value");
someType.test(list);
इस मामले में हम कंसोल में "1 विधि" मिल जाएगा। इसका मतलब है कि पहली टेस्ट विधि निष्पादित की जा रही है। सवाल यह है कि क्यों?
रनटाइम पर मेरी समझ से हमारे पास टाइप एरर की वजह से कोई जेनेरिक जानकारी नहीं है। तो, फिर दूसरा test
विधि निष्पादित नहीं की जा सकती है। मेरे लिए दूसरे test
विधि (रनटाइम पर) निम्न प्रपत्र public void test(List<Integer> integerList){...}
में होना चाहिए?
हमारे पास रनटाइम पर जेनेरिक जानकारी नहीं है, लेकिन विधि विकल्प रनटाइम पर नहीं बनाया गया है। – user2357112
ठीक है, लेकिन विधि विधि कैसे की जाती है? क्या बाइटकोड में कोई विशिष्ट जानकारी है जो जेवीएम को कॉल करने की विधि बताती है? – ruvinbsu
@ruvinbsu क्योंकि संकलक यह तय करता है कि उसे किस विधि को कॉल करना चाहिए, हां। – SomeJavaGuy