Bisakah suatu antarmuka memperluas banyak antarmuka di Java?


126

Bisakah suatu antarmuka memperluas banyak antarmuka di Java? Kode ini tampak valid di IDE saya dan kompilasi:

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

tetapi saya telah mendengar bahwa pewarisan berganda tidak diizinkan di Jawa. Mengapa tampaknya ada pengecualian untuk antarmuka?


3
Artikel mana yang mengatakan itu tidak mungkin? Mereka salah, atau Anda salah paham dan mereka berbicara tentang kelas daripada antarmuka.

7
Pertanyaan ini tampaknya di luar topik karena dapat dengan mudah dijawab dengan penelitian sendiri
JoseK

4
@StephenC Jika dia menemukan artikel yang bertentangan, dia harus mempostingnya. Dengan cara itu orang tahu untuk tidak membaca artikel-artikel itu ...
Tapi Aku Bukan Kelas Pembungkus

10
Jawaban atas pertanyaan ini menghemat waktu saya. Saya berpendapat bahwa ini memiliki nilai sebagai pertanyaan yang valid.
xdhmoore

6
pertanyaan yang membantu, saya melakukan ini dengan mengharapkan IDE saya untuk memberikan peringatan, kagum melihat tidak ada. Jadi saya tanpa sadar mengetik di google pertanyaan yang sama dengan ops yang membawa saya ke halaman ini dengan beberapa jawaban / konfirmasi
Arthur

Jawaban:


171

Ya kamu bisa melakukannya. Antarmuka dapat memperluas beberapa antarmuka, seperti yang ditunjukkan di sini:

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

Satu kelas juga dapat mengimplementasikan banyak antarmuka. Bagaimana jika dua antarmuka memiliki metode yang mendefinisikan nama dan tanda tangan yang sama?

Ada poin yang rumit:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Kemudian implementasi tunggal bekerja untuk keduanya :).

Baca lengkap posting saya di sini:

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


@RahulBhadana Metode abstrak harus diganti bukan?
Suresh Atta

13
Bagaimana jika Anda memiliki antarmuka A dengan void test()dan antarmuka B boolean test()? (Apakah ini sepupu dari masalah intan ?) __Cobalah dan hal yang masuk akal terjadi: tidak diizinkan jika tipe pengembaliannya berbeda.
Daniel

@sureshatta - jadi apa yang terjadi? apakah itu memanggil keduanya ??
Fattie

4
Kelas tidak mengizinkan 2 metode tanda tangan yang sama dengan tipe pengembalian yang berbeda. stackoverflow.com/questions/16149285/…
Ninh Pham

73

Sebuah antarmuka dapat memperpanjang beberapa interface .

Sebuah kelas dapat mengimplementasikan banyak antarmuka .

Namun, suatu kelas hanya dapat memperpanjang satu kelas .

Hati-hati bagaimana Anda menggunakan kata-kata extendsdan implementsketika berbicara tentang interfacedan class.


8

Bisakah suatu antarmuka memperluas banyak antarmuka dalam java?

Jawabannya adalah: Ya.

Menurut JLS

Antarmuka dapat dinyatakan sebagai ekstensi langsung dari satu atau lebih antarmuka lainnya, yang berarti bahwa ia secara implisit menentukan semua jenis anggota, metode abstrak, dan konstanta dari antarmuka yang diperluas, kecuali untuk setiap jenis anggota dan konstanta yang mungkin disembunyikan.


JLS = "Spesifikasi Bahasa Jawa" yang merupakan sumber otoritatif dalam pertanyaan ini.
Hontvári Levente

6

Dari halaman dokumentasi Oracle tentang beberapa jenis warisan, kami dapat menemukan jawaban yang akurat di sini . Di sini kita harus terlebih dahulu mengetahui jenis multiple inheritance di java: -

  1. Warisan berganda dari negara.
  2. Berbagai warisan implementasi.
  3. Jenis pewarisan berganda.

Java "tidak mendukung multiple inheritance of state, tetapi mendukung multiple inheritance of implementation dengan metode default sejak Java 8 rilis dan multiple inheritance of type with interfaces.

Maka di sini muncul pertanyaan untuk "masalah berlian" dan bagaimana Java menangani hal itu: -

  1. Dalam hal multiple inheritance implementasi java compiler memberikan kesalahan kompilasi dan meminta pengguna untuk memperbaikinya dengan menentukan nama antarmuka. Contoh di sini: -

                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 {
    
                }

Jadi di sini kita akan mendapatkan kesalahan sebagai: - antarmuka D mewarisi default yang tidak terkait untuk metode () dari tipe B dan C antarmuka D meluas B, C

Anda dapat memperbaikinya seperti: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Dalam multiple inheritance dari tipe java memungkinkan karena antarmuka tidak mengandung bidang yang bisa berubah dan hanya satu implementasi akan menjadi milik kelas sehingga java tidak memberikan masalah apa pun dan memungkinkan Anda untuk melakukannya.

Dalam Kesimpulan kita dapat mengatakan bahwa java tidak mendukung multiple inheritance of state tetapi mendukung Java multiple inheritance of implementation dan multiple inheritance of type .


1
Saya pikir ini adalah jawaban yang lebih cocok dan lebih menjelaskan pertanyaan itu. +1
Ketan Joshi

Terima kasih @KetanJoshi ini memotivasi banyak untuk melanjutkan :)
shankar upadhyay

4

Anda dapat memperpanjang beberapa Interfacestetapi Anda tidak dapat memperpanjang beberapa classes.

Alasan bahwa tidak mungkin di Jawa untuk memperluas beberapa kelas, adalah pengalaman buruk dari C ++ di mana ini mungkin.

Alternatif untuk pewarisan multipe adalah kelas dapat mengimplementasikan banyak antarmuka (atau Antarmuka dapat memperpanjang beberapa Antarmuka)


2

Saya pikir kebingungan Anda terletak pada pewarisan berganda, di mana itu adalah praktik yang buruk untuk melakukannya dan di Jawa ini juga tidak mungkin. Namun, mengimplementasikan beberapa antarmuka diizinkan di Jawa dan juga aman.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.