Java - Method name collision in interface implementation
Java - коллизия имен методов в реализации интерфейса
Если у меня есть два интерфейса , оба совершенно разные по своему назначению , но с одинаковой сигнатурой метода , как мне заставить класс реализовать оба, не будучи вынужденным писать единый метод, который служит для обоих интерфейсов , и писать некоторую запутанную логику в реализации метода, которая проверяет, для какого типа объекта выполняется вызов, и вызывает соответствующий код?
В C # это преодолевается тем, что называется явной реализацией интерфейса. Есть ли какой-либо эквивалентный способ в Java?
Переведено автоматически
Ответ 1
Нет, в Java нет способа реализовать один и тот же метод двумя разными способами в одном классе.
Это может привести ко многим запутанным ситуациям, именно поэтому Java запретила это.
interfaceISomething { voiddoSomething(); }
interfaceISomething2 { voiddoSomething(); }
classImplimplementsISomething, ISomething2 { voiddoSomething() {} // There can only be one implementation of this method. }
Что вы можете сделать, так это составить класс из двух классов, каждый из которых реализует свой интерфейс. Тогда этот один класс будет вести себя как оба интерфейса.
Хотя это не позволяет выполнять приведения из AlfaBeta в Beta, понижающие преобразования, как правило, являются злом, и если можно ожидать, что у Alfa экземпляра часто тоже есть Beta аспект, и по какой-то причине (обычно оптимизация - единственная уважительная причина) вы хотите иметь возможность преобразовать его в Beta, вы могли бы создать подинтерфейс Alfa с Beta asBeta() в нем.
Ответ 3
Если вы сталкиваетесь с этой проблемой, это, скорее всего, потому, что вы используете наследование там, где вы должны использовать делегирование. Если вам нужно предоставить два разных, хотя и похожих интерфейса для одной и той же базовой модели данных, то вам следует использовать view, чтобы дешево предоставить доступ к данным с использованием какого-либо другого интерфейса.
Чтобы привести конкретный пример для последнего случая, предположим, вы хотите реализовать оба Collection и MyCollection (которые не наследуются от Collection и имеют несовместимый интерфейс). Вы могли бы предоставить функции Collection getCollectionView() и MyCollection getMyCollectionView(), которые обеспечивают облегченную реализацию Collection и MyCollection, используя те же базовые данные.
В первом случае ... предположим, вам действительно нужен массив целых чисел и массив строк. Вместо наследования от обоих List<Integer> и List<String>, вы должны иметь один элемент типа List<Integer> и другой элемент типа List<String> и ссылаться на эти элементы, а не пытаться наследовать от обоих. Даже если вам нужен был только список целых чисел, в этом случае лучше использовать композицию / делегирование вместо наследования.
Ответ 4
Единственное решение, которое пришло мне в голову, - это использовать объекты referece для того, который вы хотите внедрить в интерфейсы muliple.
например: предположим, у вас есть 2 интерфейса для реализации