หากชนิดใช้สองอินเตอร์เฟสและแต่ละinterface
วิธีกำหนดว่ามีลายเซ็นเหมือนกันดังนั้นจะมีเพียงวิธีเดียวเท่านั้นและจะไม่แยกความแตกต่าง หากกล่าวว่าทั้งสองวิธีมีประเภทผลตอบแทนที่ขัดแย้งกันมันจะเป็นข้อผิดพลาดในการรวบรวม นี่คือกฎทั่วไปของการสืบทอดวิธีการเอาชนะการซ่อนเร้นและการประกาศและนำไปใช้กับความขัดแย้งที่เป็นไปได้ไม่เพียง แต่ระหว่างinterface
วิธีที่สืบทอดมา 2 วิธีเท่านั้น แต่ยังinterface
เป็นclass
วิธีการที่ยอดเยี่ยมและหรือแม้แต่ความขัดแย้ง
ตัวอย่างความเข้ากันได้
นี่คือตัวอย่างที่คุณมีinterface Gift
ซึ่งมีpresent()
วิธีการ (ในขณะที่นำเสนอของขวัญ) และยังมีinterface Guest
ซึ่งนอกจากนี้ยังมีpresent()
วิธีการ (ในขณะที่ผู้เข้าพักเป็นปัจจุบันและไม่ขาด)
Presentable johnny
เป็นทั้งและGift
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
-quivalent" ( 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()
และ a boolean present()
ในหนึ่งประเภทตัวอย่างนี้ส่งผลให้เกิดข้อผิดพลาดในการรวบรวม
สรุป
คุณสามารถสืบทอดวิธีการที่มี@Override
- เทียบเท่าภายใต้ข้อกำหนดปกติของวิธีการแทนที่และซ่อน เนื่องจากพวกเขาเป็น @Override
เทียบเท่าได้อย่างมีประสิทธิภาพมีเพียงหนึ่งวิธีการที่จะใช้และทำให้ไม่มีอะไรที่จะแยกแยะ / เลือกจากเป็น
คอมไพเลอร์ไม่จำเป็นต้องระบุวิธีการใดที่จะใช้อินเทอร์เฟซเพราะเมื่อพวกเขาถูกกำหนดให้เป็น@Override
- เทียบเท่ามันเป็นวิธีการเดียวกัน
การแก้ไขความเข้ากันไม่ได้ที่อาจเกิดขึ้นอาจเป็นงานที่ยุ่งยาก แต่นั่นก็เป็นอีกประเด็นหนึ่ง
อ้างอิง