इसका क्या अर्थ है कि यदि आपके पास एक कॉन्वेंट (संकुचित) रिटर्न प्रकार के साथ कोई विधि है, तो संकलक आपके लिए सिंथेटिक पुल विधि बनाएगा और इस पुल विधि के माध्यम से ओवरराइडिंग विधि का आह्वान करेगा। रिवर्स टाइप में कॉन्वर्सिस जावा 5 में एक ही समय में जेनरिक के रूप में पेश किया गया था और इसे पुल विधियों का उपयोग करके लागू किया गया है।
उदाहरण 1: वापसी प्रकार में सहप्रसरण भी, भले ही कोई जेनरिक मौजूद हैं सिंथेटिक पुल तरीकों का उपयोग कर कार्यान्वित किया जाता है।
उदाहरण के लिए:
abstract class A {
public abstract A get();
}
class B extends A {
@Override
public B get() {
return this;
}
}
एक कृत्रिम पुल विधि है कि मूल विधि के प्रतिनिधियों का उपयोग कर संकलक द्वारा बाईटकोड में लागू किया जाएगा। सिद्धांत रूप में आप कल्पना कर सकते है कि संकलक इस के लिए covariant ओवरराइड अनुवाद:
abstract class A {
public abstract A get();
}
class B extends A {
//bytecode only bridge method
@Override
public A get() {
return get;
}
public B get() {
return this;
}
}
उदाहरण 2 - जेनेरिक्स: चलो एक उदाहरण देखें, जब जेनरिक शामिल कर रहे हैं।
abstract class A<T> {
public abstract T get();
}
class B extends A<String> {
@Override
public String get() {
return "hello";
}
}
विधि get()
वर्ग B
के वर्ग A
में विधि get
को वापसी प्रकार में covariant है। कोड के इस बिट को संकलित करते समय संकलक मिटा देगा जिसका अर्थ है कि यह जेनरिक को अपनी सीमाओं से प्रतिस्थापित करेगा और यह सुनिश्चित करने के लिए कि सब कुछ काम करता है, को जोड़ देगा।
विलोपन के बाद कक्षाएं इस तरह दिखेगा:
abstract class A {
public abstract Object get();
}
class B extends A {
@Override
public String get() {
return "hello";
}
}
अब के बाद से get
की विधि हस्ताक्षर public Object get()
है जो एक हस्ताक्षर है कि मौजूद है वर्ग B
में संकलक वर्ग B
में एक पुल विधि में उत्पन्न होगा नहीं है ओवरराइडिंग प्राप्त करने के लिए आदेश।
आप कक्षा B
के बारे में सोच सकते हैं नीचे दिये गये दिख रहे हैं। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि नीचे दिया गया कोड कभी नहीं बनाया जाएगा। यह संकलित नहीं होगा। कंपाइलर बाइटकोड में समकक्ष get
विधि उत्पन्न करता है।
class B extends A {
//bridge method
@Override
public Object get() {
return get();
}
public String get() {
return "hello";
}
}
हर बहुरूपी कि get
invokes पुल तरीका है जिसके वास्तविक प्राप्त विधि प्रतिनिधि होगा लागू करेगा A
के माध्यम से वर्ग B
का उपयोग।
बहुत रोचक! और दो विधियों के कारण कोई त्रुटि नहीं है जिसमें एक ही कक्षा के समान नाम/पैरामीटर हैं? अर्थात। "सर्कल" संदेश में डुप्लिकेट विधि getType()? – sp00m
@ sp00m: यदि आप जावा कंपाइलर को पास करने का प्रयास करते हैं तो एक त्रुटि होगी, क्योंकि विधियां केवल रिटर्न प्रकार से भिन्न नहीं हो सकती हैं। लेकिन JVM बाइटकोड स्तर पर, वह प्रतिबंध मौजूद नहीं है। – mhsmith