Класс, наследующий от нескольких интерфейсов, имеющих одинаковую сигнатуру метода - PullRequest
4 голосов
/ 02 июня 2011

1) Как решить эту проблему в Java?

2) Что если в интерфейсах отличаются только типы возврата?

Ответы [ 2 ]

8 голосов
/ 02 июня 2011

1) Как решить эту проблему в Java?

По сути, разные «версии» метода в соответствующих интерфейсах связаны с одним и тем же методом реализации.

  • Если это то, что вы хотите, хорошо.

  • Если вы действительно хотите разные версии метода для каждого интерфейса, то вы застряли. Вы не можете сделать это в Java.


2) Что если в интерфейсах различаются только типы возвращаемых данных?

Если возвращаемые типы несовместимы, вы не можете написать класс, который реализует все интерфейсы. Ошибка компиляции.

Так когда же возвращаемые типы совместимы?

  • До Java 5.0 возвращаемый тип переопределенного или реализуемого метода должен был быть таким же , как и возвращаемый переопределенный или реализованный метод.

  • В Java 5.0 язык был изменен, чтобы позволить вам переопределить / реализовать метод с типом возврата, который является подклассом типа возврата переопределенного / реализованного метода.

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

(Примечание: в Java 5.0 + речь идет об отношении подкласса между объявленными возвращаемыми типами ... а не типами времени выполнения возвращаемых объектов.)

3 голосов
/ 02 июня 2011

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

2) Нет проблем, если возвращаемые типы совместимы (см. ковариантные возвращаемые типы ). Просто вы можете изменить возвращаемый тип, если новый расширяет тот, который определен в интерфейсе:

class A {
 ...
 List returnList();
}

class B extends A {
 ...
 ArrayList returnList(); // possible as an ArrayList is a List
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...