Унаследованные методы с тем же именем, как это работает? - PullRequest
2 голосов
/ 02 декабря 2011

Просто для любопытства я попробовал это:

public interface test1 {
    public Object method1(String str);
}

public interface test2 {
    public Object method1(String str);
}

public class Test implements test1, test2 {    
    public static void main(String... args) {

    }

    public Object method1(String str) {
        return new Object();
    }
}

Я ожидал какой-то ошибки в строке public class Test implements test1, test2 { от Eclipse, но ее не было.

  1. Почему нет ошибки времени компиляции, поскольку происходит столкновение имена методов?
  2. Сколько методов унаследовано в class Test?
  3. Если ответ на поставленный выше вопрос 2, то какой именно метод мы реализовали?
  4. А во время выполнения, почему правильно реализованный метод выбран? а не другой?
  5. И, наконец, есть ли способ реализовать оба? (Я почти уверен, что ответ НЕТ)

Я знаю, что с точки зрения дизайна, это может не произойти в реальных ситуациях, но, как я упоминал в начале, это просто пришло мне в голову, и я попробовал это.

Любые разъяснения / ссылки с благодарностью.

Ответы [ 3 ]

7 голосов
/ 02 декабря 2011

Нет столкновения. Оба интерфейса требуют метода с именем method1, и оба удовлетворяются method1 в вашем примере класса. Когда вы реализуете интерфейс, вы вообще не наследуете какие-либо методы; Вы только обещаете реализовать методы самостоятельно.

Ответ на ваш последний вопрос см. В этом существующем вопросе SO:

Java - Столкновение имени метода в реализации интерфейса

Существует предложение для Java 8, позволяющее интерфейсам указывать реализацию по умолчанию, называемое Виртуальные методы расширения . Если это делает его языком, то для двух интерфейсов будет возможно указать разные реализации по умолчанию для одной и той же сигнатуры метода. Если эти интерфейсы затем будут реализованы одним классом, он должен будет предоставить свою собственную реализацию (т. Е. Он не будет эквивалентен ни одному интерфейсу, определяющему значение по умолчанию) - см. 3.3. Конфликтующие значения по умолчанию .

0 голосов
/ 02 декабря 2011

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

класс реализовал все методы интерфейса Test1, а также Test2 и Eventhough имя метода сталкивается, кодификации для реализацииудовлетворяет, поэтому не выдает ошибку.

b) нет ничего подобного наследованию при реализации интерфейсов, все, что вам нужно сделать, это реализовать все методы интерфейса в вашем классе, иначе он должен быть объявлен как абстрактный класс.

0 голосов
/ 02 декабря 2011

Ваши интерфейсы не имеют реализаций в методах, и их сигнатуры идентичны. Следовательно, фактически существует только одна версия этого метода, и это реализация в классе Test.

Так что на самом деле не существует никакого конфликта имен.

...