Чи може інтерфейс розширити декілька інтерфейсів на Java?


126

Чи може інтерфейс розширити декілька інтерфейсів на Java? Цей код видається дійсним у моєму IDE і він компілює:

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

але я чув, що багаторазове успадкування заборонено на Java. Чому, здається, є виняток для інтерфейсів?


3
У яких статтях сказано, що це неможливо? Вони або помиляються, або ви їх неправильно зрозуміли і говорять про класи, а не про інтерфейси.

7
Це питання видається поза темою, оскільки на нього можна легко відповісти самодослідженням
ХосеК

4
@StephenC Якщо він виявив суперечливі статті, він повинен розмістити їх. Таким чином люди знають, що не читають цих статей ...
Але я не клас обгортки

10
Відповідь на це запитання заощадила мені час. Я стверджую, що він має значення як валидне питання.
xdhmoore

6
корисне запитання, я зробив це, очікуючи, що мій IDE викличе деякі застереження, був вражений тим, що його не побачив. Тож я несвідомо набрав у google те саме запитання, що й оператор, який привів мене на цю сторінку з деякими відповідями / підтвердженнями
Артур

Відповіді:


170

Так, ви можете це зробити. Інтерфейс може розширювати кілька інтерфейсів, як показано тут:

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 Абстрактний метод повинен переважати правильно?
Суреш Атта

13
Що робити, якщо у вас є інтерфейс A з void test()та інтерфейс B з boolean test()? (Це двоюрідний брат проблеми з діамантом ?) __ Спробував це, і трапляється розумне: не дозволено, якщо тип повернення відрізняється.
Даніель

@sureshatta - так що станеться? це дзвонить обом ??
Fattie

4
Клас не допускає двох методів одного підпису з різним типом повернення. stackoverflow.com/questions/16149285/…
Ninh Pham

73

Інтерфейс може розширювати кілька інтерфейсів .

Клас може реалізувати кілька інтерфейсів .

Однак клас може поширювати лише один клас .

Обережно, як ти вживаєш слова extendsі implementsколи говориш про interfaceі class.


8

Чи може інтерфейс розширити декілька інтерфейсів у Java?

Відповідь: Так.

За даними JLS

Інтерфейс може бути оголошений прямим розширенням одного або декількох інших інтерфейсів, це означає, що він неявно вказує всі типи членів, абстрактні методи та константи інтерфейсів, які він розширює, за винятком будь-яких типів членів та констант, які він може приховати.


JLS = "Специфікація мови Java", яка є авторитетним джерелом у цих питаннях.
Хонтварі Левенте

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 успадковує непов'язані за замовчуванням для методу () від типів В і С інтерфейс D поширює B, C

Ви можете виправити це так:

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. При множинному успадкуванні типу java це дозволяє, оскільки інтерфейс не містить змінних полів, і лише одна реалізація належить до класу, тому java не видає жодних проблем, і це дозволяє вам зробити це.

На закінчення можна сказати, що java не підтримує множинне успадкування стану, але він підтримує множинне успадкування реалізації та множинне успадкування типу .


1
Я вважаю, що це більш відповідна відповідь і більше уточнює питання. +1
Кетан Джоші

Дякую @KetanJoshi, це дуже спонукає продовжувати роботу :)
shankar upadhyay

4

Ви можете розширити мультиплікатор , Interfacesале ви не можете продовжити множинним classes.

Причиною того, що в Java неможливо розширити кілька класів, є поганий досвід роботи з C ++, де це можливо.

Альтернативою багатонаступного успадкування є те, що клас може реалізувати кілька інтерфейсів (або інтерфейс може розширювати кілька інтерфейсів)


2

Я думаю, що ваша плутанина полягає в багатократному успадкуванні, в якому це погана практика, а в Java це теж неможливо. Однак реалізація декількох інтерфейсів дозволена в Java, і це також безпечно.


2

Клас Java може розширювати лише один батьківський клас. Багаторазове успадкування заборонено. Однак інтерфейси не є класами, і інтерфейс може поширюватися на більш ніж один батьківський інтерфейс.

наприклад, подивіться тут: http://www.tutorialspoint.com/java/java_interfaces.htm

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.