Подтвердить что ты не робот

Java переопределяет два интерфейса, столкновение имен методов

Я реализую интерфейс Map<V,K> и Collection<V> в одном классе, но метод remove(Object) встречается в обоих интерфейсах, поэтому eclipse показывает мне некоторые ошибки. Типы возврата разные, один возвращает boolean, а другой V, но это, похоже, не имеет значения.

Есть ли способ сказать java/eclipse, какой метод фактически переопределяется?

EDIT: у меня есть интерфейс, который должны реализовывать все значения, он передает значение с помощью метода getKey(), позволяя написать функцию добавления для карты. Но, похоже, не существует способа, чтобы этот класс выглядел как карта и коллекция одновременно?

4b9b3361

Ответ 1

Нет, нет прямого пути.

Фактически динамическое связывание учитывает подпись, исключающую возвращаемый тип, поэтому компилятор Java не может принять два метода для того же класса, которые имеют одну и ту же подпись, но разные типы возвращаемых данных. Если два метода имеют одинаковые имена и одинаковые параметры, они ДОЛЖНЫ также иметь одинаковый тип возврата, к сожалению, для вас.

Единственный способ - разделить поведение в двух разных классах и составить их. Может быть, метод вроде Collection<V> asCollection() или что-то в этом роде.

Ответ 2

Нет, не существует способа разрешения таких конфликтов.

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

Ответ 3

В Map уже есть keySet(), который представляет собой набор ключей. Зачем вам нужна коллекция? Если это так, просто выполните два метода типа asMap и asCollecton, которые возвращают разные типы.

Ответ 4

Вероятно, вам потребуется композиция вместо наследования. К сожалению, для Java нет поддержки на уровне языка - я имею в виду, что это можно сделать, но это излишне трудоемко.

Ответ 5

Вам нужно переосмыслить свой дизайн. По сути, карта отличается от коллекции. Подумайте о методе Collection.add(). Имеет ли смысл добавлять объект без ключа или ключа без значения для карты?

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