Использование @Override с супер интерфейсом - PullRequest
0 голосов
/ 26 августа 2011

ОБНОВЛЕНИЕ: когда-то это была проблема уровня компиляции с maven.

Проблема касается аннотации @Override и суперинтерфейсов.

Это просто, потому что проблема в том, что аннотация @Override не распространяется на верхние интерфейсы ...

Вот простой код для понимания проблемы:

public abstract interface CrudDao<T>
{
    void update(T bean);

    T get(Object... pk);

    void delete(Object ...pk);

    T create(T bean);
}



public interface BeanDao extends CrudDao<Bean>
{
    Bean moreSpecificGetMethod();
    void moreSpecificUpdateMethod();
}

public class BeanDaoImpl implements BeanDao {

    @Override
    public void update(Bean bean){}

    @Override
    public Bean get(Object... pk){}

    //... Rest of the methods 
}

Компилятор говорит, что методы должны быть созданы в интерфейсе BeanDao. Почему он не разрешает методы из суперинтерфейса?

Ответы [ 4 ]

1 голос
/ 26 августа 2011

Компилятор и процессор аннотаций @Override в порядке.Во время компиляции с использованием javac (в командной строке) для метода обновления BeanDaoImpl class отображается следующее сообщение:

update (info.example.Bean) в info.example.BeanDaoImpl не можетреализовать обновление (T) в info.example.CrudDao;попытка назначить более слабые права доступа;был общедоступным

, и причина в том, что метод update в CrudDao на самом деле публичный.Согласно Спецификация языка Java :

Каждое объявление метода в теле интерфейса неявно общедоступно.

И при создании BeanDaoImpl.update метод public, сообщение об ошибке исчезает.То же самое относится и к аналогичным сообщениям об ошибках других методов.

Существует также проблема с настройками проекта Eclipse.Просто потому, что вы используете JDK 1.6 для запуска Eclipse, вам не нужно, чтобы компилятор автоматически не жаловался на обработку аннотаций @Override.Вам нужно будет установить Compiler compliance level проекта на 1.6 на панели Java Compiler настроек вашего проекта.Значение 1,5 приведет к тому, что процессор аннотаций Eclipse будет жаловаться на нереализованные методы, когда на самом деле эти методы были реализованы, но объявлены в суперинтерфейсе, как в вашем случае.

Проблема с компиляторомНастройки уровня соответствия частично связаны с первоначальной @Override спецификацией - она ​​была ограничена только суперклассами и не включала интерфейсы в качестве супертипа.Это было исправлено в Java 6, но документация не была обновлена ​​.Уровень соответствия компилятора 1,5 заставляет процессор аннотаций Eclipse обрабатывать аннотированные методы @Override как те, которые требуют существования в суперклассе, а не в супертипе.

0 голосов
/ 26 августа 2011

Состояние @Override Javadoc.

Указывает, что объявление метода предназначено для переопределения объявления метода в суперклассе.Если метод аннотирован этим типом аннотации, но не переопределяет метод суперкласса, компиляторы должны сгенерировать сообщение об ошибке.

В вашем случае возникает проблема:

  • Либо это интерфейс, который вам потребуется для extends (а не implements BeanDao и удаления метода update / get), либо
  • Это класс (не абстрактный), что означаетвы implements BeanDao и реализуете переопределенные методы.
0 голосов
/ 26 августа 2011

Очевидное исправление к вашему опубликованному коду:

public class BeanDaoImpl implements BeanDao {
    @Override
    public void update(Bean bean) {}

    @Override
    public Bean get(Object... pk) {
        return null;
    }
}

Методы должны быть открытыми и иметь тело.

0 голосов
/ 26 августа 2011

открытый интерфейс BeanDaoImpl реализует BeanDao {

@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

//... Rest of the methods  }

Измените навесное оборудование на расширения.Интерфейсы не реализуют другие интерфейсы, они расширяют их.

Если вы сделаете это, ошибка, на которую вы ссылаетесь, исчезнет.

Должно быть:

открытый интерфейс BeanDaoImpl extends BeanDao {

@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

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