Bir arabirim, Java'da birden çok arabirimi genişletebilir mi?


127

Bir arabirim, Java'da birden çok arabirimi genişletebilir mi? Bu kod IDE'mde geçerli görünüyor ve derliyor:

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

ancak Java'da çoklu kalıtıma izin verilmediğini duymuştum. Neden arayüzler için bir istisna var gibi görünüyor?


3
Hangi makaleler bunun mümkün olmadığını söylüyor? Ya yanılıyorlar ya da onları yanlış anladınız ve arayüzlerden çok sınıflardan bahsediyorlar.

7
Bu soru konu dışı gibi görünüyor çünkü kendi kendine araştırma ile kolayca cevaplanabilir
JoseK

4
@StephenC Eğer çelişkili makaleler bulursa, onları göndermelidir. Bu şekilde insanlar bu makaleleri
okumamaları

10
Bu sorunun cevabı bana zaman kazandırdı. Geçerli bir soru olarak değeri olduğunu savunuyorum.
xdhmoore

6
faydalı soru, bunu IDE'min bazı uyarılar atmasını bekleyerek yaptım, hiçbirini görmediğim için şaşırdım. Bu yüzden, beni bazı cevaplar /
Arthur

Yanıtlar:


171

Evet, bunu yapabilirsin. Bir arayüz, burada gösterildiği gibi birden çok arayüzü genişletebilir:

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

Tek bir sınıf, birden çok arabirimi de uygulayabilir. Ya iki arayüzün aynı adı ve imzayı tanımlayan bir yöntemi varsa?

Zor bir nokta var:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Sonra tek uygulama her ikisi için de çalışır :).

Yazımın tamamını buradan okuyun:

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


@RahulBhadana Soyut yöntem geçersiz kılmalıdır, değil mi?
Suresh Atta

13
Ya A void test()arayüzüne ve B ile arayüze sahipseniz boolean test()? (Bu, elmas sorununun kuzeni mi?) __Denedim ve mantıklı bir şey oldu: dönüş türü farklıysa izin verilmez.
Daniel

@sureshatta - peki ne olur? ikisini de çağırıyor mu ?
Fattie

4
Bir sınıf, farklı dönüş türlerine sahip 2 yönteme aynı imzaya izin vermez. stackoverflow.com/questions/16149285/…
Ninh Pham

74

Bir arabirim olabilir çoklu arayüzleri uzatmak .

Bir sınıf edebilirsiniz birden arabirimlerini .

Ancak, bir sınıf yalnızca tek bir sınıfı genişletebilir .

Kelimeleri nasıl kullandıklarını Dikkatli extendsve implementsbahsederken interfaceve class.


8

Bir arayüz, java'da birden fazla arayüzü genişletebilir mi?

Cevap: Evet.

JLS'ye göre

Bir arabirim, bir veya daha fazla başka arabirimin doğrudan bir uzantısı olarak bildirilebilir; bu, gizleyebileceği üye türleri ve sabitler dışında, genişlettiği arabirimlerin tüm üye türlerini, soyut yöntemlerini ve sabitlerini örtük olarak belirlediği anlamına gelir.


JLS = Bu sorularda yetkili kaynak olan "Java Dil Belirtimi".
Hontvári Levente

6

Çoklu miras türü hakkındaki Oracle dokümantasyon sayfasından doğru yanıtı burada bulabiliriz . Burada önce java'daki çoklu kalıtımın türünü bilmeliyiz: -

  1. Devletin çoklu mirası.
  2. Çoklu uygulama mirası.
  3. Çoklu tür mirası.

Java "birden çok durum mirasını desteklemez, ancak java 8 sürümünden ve arabirimlerle çoklu tür mirasından bu yana varsayılan yöntemlerle uygulamanın çoklu kalıtımını destekler.

Sonra burada "elmas sorunu" ve Java'nın bununla nasıl başa çıktığı sorusu ortaya çıkıyor: -

  1. Birden fazla uygulama mirası olması durumunda, java derleyicisi derleme hatası verir ve kullanıcıdan arayüz adını belirterek düzeltmesini ister. Örnek burada: -

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

Yani burada şu hatayı alacağız: - arayüz D, metod () için ilgisiz varsayılanları B tiplerinden miras alır ve C arayüzü D, B, C'yi genişletir

Bunu şu şekilde düzeltebilirsiniz: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Çoklu miras türünde java buna izin verir çünkü arayüz değişken alanlar içermez ve sınıfa yalnızca bir uygulama ait olur, böylece java herhangi bir sorun vermez ve bunu yapmanıza izin verir.

Sonuç Olarak biz bu java söyleyebiliriz desteklemediği devletin çoklu kalıtım ama desteklemiyor uygulama ve türde birden fazla miras çoklu miras .


1
Bence bu daha uygun bir cevap ve soruya daha çok açıklık getiriyor. +1
Ketan Joshi

Teşekkürler @KetanJoshi, bu devam etmek için çok motive ediyor :)
shankar upadhyay

4

Birden fazla uzatabilirsiniz Interfacesancak birden fazla uzatamazsınız classes.

Java'da birden çok sınıfı genişletmenin mümkün olmamasının nedeni, bunun mümkün olduğu C ++ 'dan gelen kötü deneyimdir.

Çoklu kalıtımın alternatifi, bir sınıfın birden fazla arayüz uygulayabilmesidir (veya bir Arayüz birden fazla Arayüzü genişletebilir)


2

Bence karışıklığınız çoklu kalıtımdan kaynaklanıyor, bunu yapmak kötü bir uygulamadır ve Java'da bu da mümkün değildir. Ancak, Java'da birden çok arabirimin uygulanmasına izin verilir ve bu da güvenlidir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.