อินเทอร์เฟซสามารถขยายหลายอินเทอร์เฟซใน Java ได้หรือไม่?


127

อินเทอร์เฟซสามารถขยายหลายอินเทอร์เฟซใน Java ได้หรือไม่? รหัสนี้ถูกต้องใน IDE ของฉันและจะรวบรวม:

interface Foo extends Runnable, Set, Comparator<String> { }

แต่ฉันเคยได้ยินมาว่าไม่อนุญาตให้มีการสืบทอดหลายรายการใน Java เหตุใดจึงมีข้อยกเว้นสำหรับอินเทอร์เฟซ


3
บทความไหนบอกว่าทำไม่ได้ พวกเขาผิดหรือคุณเข้าใจผิดและพวกเขากำลังพูดถึงคลาสมากกว่าอินเทอร์เฟซ

7
คำถามนี้ดูเหมือนจะไม่ตรงประเด็นเพราะสามารถหาคำตอบได้ง่ายด้วยการค้นคว้าด้วยตนเอง
JoseK

4
@StephenC หากเขาพบบทความที่ขัดแย้งกันเขาควรโพสต์ ด้วยวิธีนี้ผู้คนจึงรู้ว่าจะไม่อ่านบทความเหล่านั้น ...
But I'm Not A Wrapper Class

10
คำตอบสำหรับคำถามนี้ช่วยฉันประหยัดเวลา ฉันยืนยันว่ามันมีค่าเป็นคำถามที่ถูกต้อง
xdhmoore

6
คำถามที่เป็นประโยชน์ฉันคาดหวังว่า IDE ของฉันจะส่งคำเตือนบางอย่างรู้สึกประหลาดใจที่ไม่เห็น ดังนั้นฉันจึงพิมพ์คำถามเดียวกันกับ op ใน Google โดยไม่รู้ตัวซึ่งนำฉันไปที่หน้านี้พร้อมคำตอบ / คำยืนยัน
Arthur

คำตอบ:


171

ใช่คุณสามารถทำได้ อินเทอร์เฟซสามารถขยายได้หลายอินเทอร์เฟซดังแสดงที่นี่:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

คลาสเดียวยังสามารถใช้หลายอินเทอร์เฟซได้ จะเกิดอะไรขึ้นถ้าสองอินเทอร์เฟซมีวิธีการกำหนดชื่อและลายเซ็นเดียวกัน?

มีจุดที่ยุ่งยาก:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

จากนั้นการใช้งานเดี่ยวจะใช้ได้กับทั้งคู่ :)

อ่านโพสต์ทั้งหมดของฉันที่นี่:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html


@RahulBhadana วิธีนามธรรมควรแทนที่ใช่ไหม
Suresh Atta

13
จะเกิดอะไรขึ้นถ้าคุณมีอินเทอร์เฟซ A void test()และอินเทอร์เฟซ B ด้วยboolean test()? (นี่เป็นลูกพี่ลูกน้องของเจ้าปัญหาเพชรหรือเปล่า) __ ลองแล้วสิ่งที่สมเหตุสมผลก็เกิดขึ้น: ไม่อนุญาตหากประเภทการคืนสินค้าแตกต่างกัน
Daniel

@sureshatta - แล้วจะเกิดอะไรขึ้น? มันเรียกทั้งคู่ ??
Fattie

4
คลาสไม่อนุญาตให้มีลายเซ็น 2 วิธีเดียวกันกับประเภทการส่งคืนที่แตกต่างกัน stackoverflow.com/questions/16149285/…
Ninh Pham

74

อินเตอร์เฟซที่สามารถขยายการเชื่อมต่อหลาย

ระดับสามารถใช้การเชื่อมต่อหลาย

อย่างไรก็ตามระดับสามารถขยายชั้นเดียว

ระวังว่าคุณจะใช้คำว่าextendsและimplementsเมื่อพูดถึงและinterfaceclass


8

อินเทอร์เฟซสามารถขยายหลายอินเทอร์เฟซใน java ได้หรือไม่?

คำตอบคือใช่

อ้างอิงจากJLS

อินเทอร์เฟซอาจถูกประกาศให้เป็นส่วนขยายโดยตรงของอินเทอร์เฟซอื่น ๆ อย่างน้อยหนึ่งอินเทอร์เฟซซึ่งหมายความว่าระบุประเภทสมาชิกทั้งหมดโดยปริยายวิธีการนามธรรมและค่าคงที่ของอินเทอร์เฟซที่ขยายออกไปยกเว้นประเภทสมาชิกและค่าคงที่ที่อาจซ่อนไว้


JLS = "ข้อกำหนดภาษา Java" ซึ่งเป็นแหล่งข้อมูลที่เชื่อถือได้ในคำถามเหล่านี้
Hontvári Levente

6

จากหน้าเอกสารของ Oracle เกี่ยวกับประเภทมรดกหลายเราสามารถหาคำตอบที่ถูกต้องที่นี่ ที่นี่เราควรทราบประเภทของการสืบทอดหลายรายการใน java ก่อน: -

  1. การสืบทอดหลายสถานะ
  2. การสืบทอดการใช้งานหลายครั้ง
  3. การสืบทอดหลายประเภท

Java "ไม่สนับสนุนการสืบทอดหลายสถานะ แต่สนับสนุนการสืบทอดการใช้งานหลาย ๆ แบบด้วยวิธีการเริ่มต้นตั้งแต่การเผยแพร่ java 8 และการสืบทอดหลายประเภทพร้อมอินเทอร์เฟซ

จากนั้นคำถามก็เกิดขึ้นสำหรับ "ปัญหาเพชร" และวิธีที่ Java จัดการกับสิ่งนั้น: -

  1. ในกรณีที่มีการสืบทอดการใช้งานคอมไพลเลอร์ java หลายรายการทำให้เกิดข้อผิดพลาดในการคอมไพล์และขอให้ผู้ใช้แก้ไขโดยระบุชื่ออินเตอร์เฟส ตัวอย่างที่นี่: -

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }
    

ดังนั้นที่นี่เราจะได้รับข้อผิดพลาดเป็น: - อินเทอร์เฟซ D สืบทอดค่าเริ่มต้นที่ไม่เกี่ยวข้องสำหรับ method () จากอินเทอร์เฟซ B และ C ประเภท D ขยาย B, C

คุณสามารถแก้ไขได้เช่น: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. ในการสืบทอดหลายประเภทของ java อนุญาตให้ใช้งานได้เนื่องจากอินเทอร์เฟซไม่มีฟิลด์ที่เปลี่ยนแปลงได้และมีเพียงการใช้งานเดียวเท่านั้นที่จะเป็นของคลาสดังนั้น java จึงไม่ให้ปัญหาใด ๆ และช่วยให้คุณทำเช่นนั้นได้

ในบทสรุปเราสามารถพูด Java ที่ไม่สนับสนุน มรดกหลายของรัฐแต่ก็ไม่สนับสนุน มรดกหลายของการดำเนินงานและมรดกหลายประเภท


1
ฉันคิดว่านี่เป็นคำตอบที่เหมาะสมกว่าและให้ความกระจ่างกับคำถามมากขึ้น +1
Ketan Joshi

ขอบคุณ @KetanJoshi แรงจูงใจนี้จำนวนมากที่จะดำเนินการใน :)
การ์ Upadhyay

4

คุณสามารถขยายหลายแต่คุณไม่สามารถขยายหลายInterfacesclasses

สาเหตุที่ไม่สามารถขยายคลาสหลาย ๆ คลาสใน Java เป็นประสบการณ์ที่ไม่ดีจาก C ++ ที่เป็นไปได้

อีกทางเลือกหนึ่งสำหรับการสืบทอดแบบ multipe คือคลาสสามารถใช้หลายอินเทอร์เฟซ (หรืออินเทอร์เฟซสามารถขยายได้หลายอินเทอร์เฟซ)


2

ฉันคิดว่าความสับสนของคุณอยู่ที่การถ่ายทอดทางพันธุกรรมหลาย ๆ ครั้งซึ่งการทำเช่นนั้นไม่ดีและใน Java ก็เป็นไปไม่ได้เช่นกัน อย่างไรก็ตามอนุญาตให้ใช้อินเทอร์เฟซหลายตัวใน Java และยังปลอดภัยอีกด้วย


2

คลาส Java สามารถขยายคลาสพาเรนต์ได้เพียงคลาสเดียว ไม่อนุญาตให้มีการสืบทอดหลายรายการ อินเทอร์เฟซไม่ใช่คลาสอย่างไรก็ตามอินเทอร์เฟซสามารถขยายได้มากกว่าหนึ่งอินเทอร์เฟซหลัก

ตัวอย่างเช่นดูที่นี่: http://www.tutorialspoint.com/java/java_interfaces.htm

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.