Считая Javadoc для аннотации @Override
, я наткнулся на следующее правило:
Если метод аннотируется с помощью этого компиляторы типа аннотации должны генерировать сообщение об ошибке если не выполняется хотя бы одно из следующих условий:
- Метод переопределяет или реализует метод, объявленный в супертипе.
- Метод имеет подпись, переопределяющую эквивалентную любому общедоступному методу объявлен в Object.
Я понимаю, в первую очередь, но я не уверен во втором.
Что означает "переопределить-эквивалент"? Как в этом отношении существуют специальные методы Object
? И почему это не распространяется на первый критерий?
Заметка об обновлении: это относится только к документации по Java 7. Java 6 doc ничего не говорит о переопределении-эквивалентности. Почему изменение?
<сильного > Update:
После консультации с JLS (Раздел 8.4.2) я нашел следующее объяснение переопределенной эквивалентности:
Подпись метода
m1
является подсигналом сигнатуры методаm2
, если либо:
m2
имеет ту же подпись, что иm1
, или- подпись
m1
совпадает с стиранием (§4.6) подписиm2
.Две сигнатуры метода
m1
иm2
эквивалентны переопределению, если либоm1
является подсигналаm2
илиm2
является поднаклейкойm1
.
Насколько я могу судить, это отвечает на первый вопрос ( "Что это значит?" ) и третий вопрос ( "Почему первое условие не покрывает это?" ).
Если я правильно понял (пожалуйста, сообщите мне, если я этого не сделаю!), есть только один случай, когда два метода переопределяют эквивалент и которые не подпадают под первое условие исходного вопроса. Это тот случай, когда стирание подписи метода подкласса совпадает с сигнатурой метода суперкласса, но не наоборот.
Тогда второе условие исходного вопроса вступит в игру, когда мы попытаемся добавить параметры типа при попытке "переопределить" общедоступный метод класса Object
. Я попробовал следующий простой пример, чтобы проверить это, используя параметр неиспользуемого типа:
public class Foo {
@Override
public <T> boolean equals(Object obj) {
return true;
}
}
Конечно, этот класс не компилируется, потому что метод фактически не переопределяет метод equals
и, таким образом, сталкивается с ним. Но я также все еще получаю сообщение об ошибке для использования аннотации @Override
. Я ошибаюсь, полагая, что это допустимый пример второго условия использования @Override
? Или компилятор генерирует эту ошибку, несмотря на то, что не требуется?