Получение ошибки для универсального интерфейса: интерфейс Observer не может быть реализован более одного раза с разными аргументами: - PullRequest
8 голосов
/ 26 ноября 2010

Я получаю эту ошибку в Eclipse при написании приложения GWT

Интерфейс Observer не может быть реализовано более одного раза с разные аргументы: Observer и Наблюдатель

public class CompositeWordLists extends Composite implements Observer<DialogBoxAuthenticate>, Observer<CompositeListData>

Вот интерфейс

public interface Observer<T> {
    public void update(T o);
}

Это правильно? Как я могу обойти эту проблему, не создавая множество классов Observer для каждого возможного события?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

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

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

Я бы предложил следующее

interface Observer<T>{
    public void update (T o);
}

interface DialogBoxAuthenticateObserver extends Observer<DialogBoxAuthenticate>{
}

Беспорядок в коде не так уж ужасен, и если вы поместите их все в один файл, их будет легко ссылаться и поддерживать.Надеюсь, я помог

РЕДАКТИРОВАТЬ : после некоторого поиска в Google (что привело меня обратно к stackoverflow !, ваш вопрос был задан по-другому и ответил аналогично здесь

0 голосов
/ 04 декабря 2015

Не уверен, что это может помочь, но сегодня я столкнулся с той же ошибкой компиляции Java.

Я частично решил свой случай, извлекая все общие реализации, которые я мог получить в параметризованный абстрактный класс :

public enum Example {
    ;
    static interface Observer<T> { public void update (T o); }
    static abstract AbstractObserver<T> implements Observer<T> {
        public void update (T o) { /* shared stuff I can put here */ }
    }
    static Composite extends AbstractObserver<Parameter1> {
        public void update (T o) {
            super(o);
            /* type-specific code here */
        }
    }
    static CompositeWordLists extends AbstractObserver<Parameter2> {
        public void update (T o) {
            super(o);
            /* type-specific code here */
        }
    }
}
0 голосов
/ 26 ноября 2010

Composite должен уже реализовывать Observer. Это то, что действительно предназначено? Вы хотите, чтобы этот класс CompositeWordLists наблюдал два пути одновременно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...