Java наследует 2 интерфейса одним и тем же методом - PullRequest
2 голосов
/ 15 марта 2012

В следующих фрагментах кода первый не компилируется, а второй -.Зачем?В чем разница?

1.

public class test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static interface I12 extends I1,I2 { 
    public I12 m();
    }



}

2.

public class test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static class I12 implements I1,I2 { 
           public I12 m(){
                return null;
           }
    }
}

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

В Java 1.4 или более ранних версиях оба фрагмента не должны компилироваться.В версии 1.5 или более поздней должны компилироваться обе версии.

Если вы переопределяете метод в Java 1.4, вы должны предоставить точно такой же тип возвращаемого значения, что и метод базового класса.

Это ограничение было снятов Java 1.5 и более поздних версиях здесь разрешено предоставлять тип возвращаемого значения, который наследуется от возвращаемого типа метода базового класса.

Это имеет смысл и может быть полезным.Если у вас есть:

I1 x = new I12Impl();

, то все, что вы знаете, это то, что xm () возвращает I1.

Но если у вас есть немного больше информации:

I12 x = new I12Impl();

, тогдавы знаете, что xm () возвращает I12 (который также является I1).

Иногда это может быть удобно (например, вы можете избежать потери при вызове xm ())

1 голос
/ 15 марта 2012

Классу разрешено реализовывать несколько интерфейсов, но когда интерфейсы расширяют несколько интерфейсов и оба родительских интерфейса имеют одинаковый именованный метод, он выдает ошибку, отличную от того, что проблем нет. Это единственная причина, по которой он не показывает ошибок в IDE, потому что IDE (eclipse) имеет свой собственный компилятор и не использует javac для компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...