Java перекрывает два интерфейса, конфликт имен методов - PullRequest
7 голосов
/ 19 октября 2011

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

Есть ли какой-нибудь способ сообщить java / eclipse, какой метод на самом деле переопределяется?

РЕДАКТИРОВАТЬ: у меня есть интерфейс, который должны реализовывать все значения, он предоставляет значение с помощью метода getKey (), что позволяет написать функцию добавления для карты.Но, похоже, нет никакого способа позволить этому одному классу одновременно выглядеть как карта и коллекция?

Ответы [ 5 ]

8 голосов
/ 19 октября 2011

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

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

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

1 голос
/ 19 октября 2011

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

1 голос
/ 19 октября 2011

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

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

0 голосов
/ 19 октября 2011

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

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

0 голосов
/ 19 октября 2011

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

...