2017-02-14 11 views
3

В Java класс может распространять только один родительский класс, но может реализовывать несколько интерфейсов. С внедрение методов по умолчанию в 8 интерфейса Java, есть возможность класса наследуемых более одного метод с той же сигнатурой, реализовав 2 интерфейса, имеющие один и тот же метод по умолчанию Это может создать проблемы с бриллиантом, как в C++Правила разрешения проблемы с диамантом или множественное наследование в Java8

Пример ниже в коде выход

new C().hello(); is 

This is Second

public interface First { 

    default void hello(){ 
     System.out.println("This is First"); 
    } 
} 

public interface Second extends First { 

    default void hello(){ 
     System.out.println("This is Second"); 
    } 
} 

    public class MyClass implements First,Second { 

    public static void main(String[] args) { 
     new MyClass().hello(); 
    } 
} 

Каковы правила разрешения, которые использует Java для RESOL проблема алмаза? Простой ответ, например, кто имеет преимущество и когда будет здорово.

+0

Очень интересно. Отлично, вы подняли эту проблему. –

ответ

2

Ваш фрагмент не является проблемой с алмазом, так как интерфейс второй расширяет интерфейс и переопределяет метод hello.

Без расширения интерфейса второй компилятор выдает ошибку

Duplicate default methods named hello with the parameters() and() are inherited from the types Second and First 
2

Реализация двух интерфейсов, которые декларируют то же метод по умолчанию приводит к ошибке компиляции:

MyClass inherits unrelated defaults for sayHi() from types InterfaceA and InterfaceB 

Так нет никакого алмазным проблемы;)

Чтобы решить эту проблему, вы можете переопределить метод в реализующем классе и либо реализовать его там, либо отложить до правильного интерфейса.

В вашем случае это будет выглядеть так, что (в случае, если вы хотите использовать метод интерфейса First):

public class MyClass implements First,Second { 
    public void hello() { 
     First.super.hello(); 
    } 
} 
4

Существует Oracle Tutorial, что объясняет это в значительной степени подробно.

Вы в основном переопределили свой метод из Первого интерфейса и выбран наиболее специфичный метод интерфейса.

4

Ниже приведены правила, чтобы следовать, когда класс наследует метод с той же сигнатурой из нескольких мест (другой класс или интерфейс):

  • Классы всегда выигрывают. Объявление метода в классе или суперклассе имеет приоритет над любым объявлением метода по умолчанию.
  • В противном случае, под-интерфейсы выигрывают: выбирается метод с той же сигнатурой в самом конкретном defaultproviding интерфейсе . (например, в вашем случае метод из Второго интерфейса должен работать как Second extends First).
  • Наконец, если выбор по-прежнему неоднозначен, класс, наследующий от нескольких интерфейсов, должен явно выбрать, какую реализацию по умолчанию использовать, переопределяя его и явно вызывая нужный метод .
+0

Это именно то, что я искал. Очень точный ответ со всеми описанными сценариями. Спасибо! Рохит –

 Смежные вопросы

  • Нет связанных вопросов^_^