Java переопределяет два интерфейса, столкновение имен методов
Я реализую интерфейс Map<V,K>
и Collection<V>
в одном классе, но метод remove(Object)
встречается в обоих интерфейсах, поэтому eclipse показывает мне некоторые ошибки. Типы возврата разные, один возвращает boolean
, а другой V
, но это, похоже, не имеет значения.
Есть ли способ сказать java/eclipse, какой метод фактически переопределяется?
EDIT: у меня есть интерфейс, который должны реализовывать все значения, он передает значение с помощью метода getKey(), позволяя написать функцию добавления для карты. Но, похоже, не существует способа, чтобы этот класс выглядел как карта и коллекция одновременно?
Ответы
Ответ 1
Нет, нет прямого пути.
Фактически динамическое связывание учитывает подпись, исключающую возвращаемый тип, поэтому компилятор Java не может принять два метода для того же класса, которые имеют одну и ту же подпись, но разные типы возвращаемых данных. Если два метода имеют одинаковые имена и одинаковые параметры, они ДОЛЖНЫ также иметь одинаковый тип возврата, к сожалению, для вас.
Единственный способ - разделить поведение в двух разных классах и составить их. Может быть, метод вроде Collection<V> asCollection()
или что-то в этом роде.
Ответ 2
Нет, не существует способа разрешения таких конфликтов.
Вам следует рассмотреть возможность использования состава и delegation вместо наследования для хотя бы одного из двух интерфейсов, или вы можете разделить функциональность вашего класса в двух классах, это действительно зависит от конкретной проблемы.
Ответ 3
В Map
уже есть keySet()
, который представляет собой набор ключей. Зачем вам нужна коллекция? Если это так, просто выполните два метода типа asMap
и asCollecton
, которые возвращают разные типы.
Ответ 4
Вероятно, вам потребуется композиция вместо наследования. К сожалению, для Java нет поддержки на уровне языка - я имею в виду, что это можно сделать, но это излишне трудоемко.
Ответ 5
Вам нужно переосмыслить свой дизайн. По сути, карта отличается от коллекции. Подумайте о методе Collection.add(). Имеет ли смысл добавлять объект без ключа или ключа без значения для карты?
Ваш лучший выбор (я думаю, и в зависимости от вашего приложения) заключается в том, чтобы реализовать карту, но когда вам нужна коллекция, используйте один из своих методов, чтобы получить набор ключей, значений или пар ключей.