Может ли интерфейс расширять несколько интерфейсов в Java?


127

Может ли интерфейс расширять несколько интерфейсов в Java? Этот код отображается в моей среде IDE и компилируется:

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

но я слышал, что в Java запрещено множественное наследование. Почему для интерфейсов существует исключение?


3
В каких статьях говорится, что это невозможно? Они либо ошибаются, либо вы их неправильно поняли, и они говорят о классах, а не об интерфейсах.

7
Этот вопрос кажется не по теме, потому что на него можно легко ответить,
проведя самоисследование

4
@StephenC Если он нашел противоречащие статьи, он должен опубликовать их. Таким образом люди узнают, что эти статьи не следует читать ...
Но я не класс Wrapper

10
Ответ на этот вопрос сэкономил мне время. Я утверждаю, что этот вопрос имеет значение.
xdhmoore

6
полезный вопрос, я сделал это, ожидая, что моя IDE выдаст несколько предупреждений, был поражен, не увидев их. Так что я неосознанно ввел в Google тот же вопрос, что и опера, который привел меня на эту страницу с некоторыми ответами / подтверждением
Артур

Ответы:


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

13
Что если у вас есть интерфейс A void test()и интерфейс B boolean test()? (Это двоюродный брат проблемы с бриллиантами ?) __ Пробовал, и происходит разумная вещь: не допускается, если тип возвращаемого значения отличается.
Дэниел

@sureshatta - и что происходит? он вызывает оба ??
Fattie

4
Класс не позволяет использовать 2 метода с одинаковой сигнатурой с разным типом возврата. stackoverflow.com/questions/16149285/…
Нинь Фам

74

Интерфейс может расширять несколько интерфейсов .

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

Однако класс может расширять только один класс .

Будьте осторожны при использовании слов extendsи implementsпри разговоре о interfaceи class.


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

Вы можете исправить это так: -

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

В заключение мы можем сказать, что java не поддерживает множественное наследование состояния, но поддерживает множественное наследование реализации и множественное наследование типа .


1
Я думаю, что это более подходящий ответ и больше проясняет вопрос. +1
Кетан Джоши

Спасибо, @KetanJoshi, это очень мотивирует продолжать :)
шанкар упадхьяй

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.