यदि एक प्रकार दो इंटरफेस को लागू करता है, और प्रत्येक interfaceएक ऐसी विधि को परिभाषित करता है जिसमें समान हस्ताक्षर होते हैं, तो वास्तव में एक ही विधि है, और वे अलग-अलग नहीं हैं। यदि कहें, दो तरीकों में परस्पर विरोधी रिटर्न प्रकार हैं, तो यह एक संकलन त्रुटि होगी। यह वंशानुक्रम, विधि के ओवरराइड करने, छिपाने और घोषणाओं का सामान्य नियम है, और यह केवल 2 विरासत वाले interfaceतरीकों के बीच संभावित संघर्षों पर भी लागू होता है , लेकिन यह भी एक interfaceऔर एक सुपर classविधि, या यहां तक कि जेनेरिक के प्रकार के कारण संघर्ष भी है।
संगतता उदाहरण
यहां एक उदाहरण है जहां आपके पास एक है interface Gift, जिसमें एक present()विधि है (जैसे, उपहार पेश करना), और एक भी interface Guest, जिसमें एक present()विधि भी है (जैसा कि, अतिथि मौजूद है और अनुपस्थित नहीं है)।
Presentable johnnya Giftऔर a दोनों है Guest।
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { void present(); }
interface Presentable extends Gift, Guest { }
public static void main(String[] args) {
Presentable johnny = new Presentable() {
@Override public void present() {
System.out.println("Heeeereee's Johnny!!!");
}
};
johnny.present(); // "Heeeereee's Johnny!!!"
((Gift) johnny).present(); // "Heeeereee's Johnny!!!"
((Guest) johnny).present(); // "Heeeereee's Johnny!!!"
Gift johnnyAsGift = (Gift) johnny;
johnnyAsGift.present(); // "Heeeereee's Johnny!!!"
Guest johnnyAsGuest = (Guest) johnny;
johnnyAsGuest.present(); // "Heeeereee's Johnny!!!"
}
}
उपरोक्त स्निपेट संकलन और चलाता है।
ध्यान दें कि केवल एक ही @Override आवश्यक है !!! । इसका कारण यह है Gift.present()और Guest.present()" @Overrideअसमान" ( JLS 8.4.2 ) हैं।
इस प्रकार, johnny केवल एक ही कार्यान्वयन है present(), और इससे कोई फर्क नहीं पड़ता कि आप कैसे व्यवहार करते हैं johnny, चाहे एक Giftया एक के रूप में Guest, एक ही तरीका है।
असंगति उदाहरण
यहाँ एक उदाहरण है जहाँ दो विरासत में मिली विधियाँ @Overrideअसमान नहीं हैं :
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { boolean present(); }
interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
// "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
// both define present(), but with unrelated return types"
}
यह आगे दोहराता है कि सदस्यों को विरासत में प्राप्त होने interfaceवाले सदस्य घोषणाओं के सामान्य नियम का पालन करना चाहिए। यहां हमारे पास असंगत रिटर्न प्रकारों के साथ हैं Giftऔर Guestपरिभाषित present()करते हैं: एक voidदूसरे के साथ boolean। उसी कारण से कि आप एक void present()और boolean present()एक प्रकार में नहीं कर सकते हैं , इस उदाहरण के परिणामस्वरूप संकलन त्रुटि होती है।
सारांश
आप उन तरीकों को विरासत में दे सकते हैं @Override, जो असमान हैं, विधि की सामान्य आवश्यकताओं के अधीन होते हैं जो ओवरराइडिंग और छुपाते हैं। क्योंकि वे हैं @Override -equivalent, प्रभावी रूप से वहाँ लागू करने के लिए केवल एक ही तरीका है, और इस तरह वहाँ भेद / से चयन करने के लिए कुछ भी नहीं है।
कंपाइलर को यह पता लगाने की आवश्यकता नहीं है कि कौन सी विधि किस इंटरफ़ेस के लिए है, क्योंकि एक बार जब वे निर्धारित होने के लिए @Override-सामान्य होते हैं, तो वे एक ही विधि होते हैं।
संभावित असंगतताओं को हल करना एक मुश्किल काम हो सकता है, लेकिन यह पूरी तरह से एक और मुद्दा है।
संदर्भ