2016-02-22 2 views
3

У меня есть один класс и два интерфейсаКласс должен быть объявлен как абстрактный или реализовать абстрактный метод

public class A implements B, C { 
    public static void main(String[] args) { 
     A a = new A(); 
     a.foo(); 
    } 
} 

public interface B { 
    default void foo(){ 
     System.out.println("foo in B"); 
    } 
} 

public interface C { 
    void foo(); 
} 

Дело я беспокоит, что Java не компилировать это дает ошибку, что я должен реализовать метод от C. Следовательно, у меня есть вопрос. Почему тело по умолчанию не покрывает эту часть, я имею в виду единственную вещь, о которой нужно беспокоиться, заключается в том, что все методы имеют свои реализации, верно? Но для класса A очевидно, что реализация указана в B.

Так почему же Java дает эту ошибку?

ответ

3

Это потому, что интерфейс B и C не совпадает с деревом наследования. И если они не являются, то компилятор Java не может быть уверен, что у реализации класса есть реализация всех методов интерфейса, пока он не проверяет каждый метод из каждого интерфейса реализации.

Если вы определите интерфейс C как public interface C extends B, тогда вы не получите ошибку, потому что в этом случае компилятор Java будет уверен, что все методы реализованы.

Подробнее от JLS §9.4.1. Inheritance and Overriding

+0

Круто, не знал этого. Благодаря! – markspace

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

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