Um método que implementa um método de interface deve ser anotado @Override
?
O javadoc da Override
anotação diz:
Indica que uma declaração de método se destina a substituir uma declaração de método em uma superclasse. Se um método é anotado com esse tipo de anotação, mas não substitui um método de superclasse, os compiladores são necessários para gerar uma mensagem de erro.
Eu não acho que uma interface seja tecnicamente uma superclasse. Ou é?
java
oop
interface
annotations
Benno Richters
fonte
fonte
Respostas:
Você deve usar @Override sempre que possível. Impede que erros simples sejam cometidos. Exemplo:
Isso não compila porque não substitui corretamente
public boolean equals(Object obj)
.O mesmo vale para métodos que implementam uma interface ( somente 1.6 e acima ) ou substituem o método de uma classe Super.
fonte
Acredito que o comportamento do javac mudou - com 1,5 proibiu a anotação e com 1,6 não. A anotação fornece uma verificação extra em tempo de compilação; portanto, se você estiver usando o 1.6, eu a utilizarei.
fonte
Você sempre deve anotar métodos com,
@Override
se estiverem disponíveis.No JDK 5, isso significa substituir métodos de superclasses, no JDK 6 e 7 significa substituir métodos de superclasses e implementar métodos de interfaces. O motivo, como mencionado anteriormente, é que permite ao compilador detectar erros nos quais você acha que está substituindo (ou implementando) um método, mas na verdade está definindo um novo método (assinatura diferente).
O exemplo
equals(Object)
vs.equals(YourObject)
é um caso padrão em questão, mas o mesmo argumento pode ser feito para implementações de interface.Eu imagino que a razão pela qual não é obrigatório anotar métodos de implementação de interfaces é que o JDK 5 sinalizou isso como um erro de compilação. Se o JDK 6 tornasse essa anotação obrigatória, a compatibilidade seria retroativa.
Não sou usuário do Eclipse, mas em outros IDEs (IntelliJ), a
@Override
anotação é adicionada apenas ao implementar métodos de interface se o projeto estiver definido como um projeto JDK 6+. Eu imaginaria que o Eclipse é semelhante.No entanto, eu preferiria ver uma anotação diferente para esse uso, talvez uma
@Implements
anotação.fonte
Eu o usaria em todas as oportunidades. Consulte Quando você usa a anotação @Override do Java e por quê?
fonte
O JDK 5.0 não permite que você use
@Override
anotações se estiver implementando o método declarado na interface (erro de compilação), mas o JDK 6.0 permite. Assim, você pode configurar sua preferência de projeto de acordo com sua exigência.fonte
Se uma classe concreta não está substituindo um método abstrato, o uso
@Override
para implementação é um assunto em aberto, pois o compilador sempre avisa sobre quaisquer métodos não implementados. Nesses casos, pode-se argumentar que isso prejudica a legibilidade - é mais coisas para ler no seu código e, em menor grau, é chamado@Override
e não@Implement
.fonte
Substituir seus próprios métodos herdados de suas próprias classes normalmente não afeta as refatorações usando um ide. Mas se você substituir um método herdado de uma biblioteca, é recomendável usá-lo. Caso contrário, muitas vezes você não receberá nenhum erro em uma alteração posterior da biblioteca, mas um bug bem escondido.
fonte
Não é um problema com o JDK. No Eclipse Helios, ele permite a anotação @Override para métodos de interface implementados, o que for JDK 5 ou 6. Como no Eclipse Galileo, a anotação @Override não é permitida, o que for JDK 5 ou 6.
fonte
Para mim, muitas vezes esse é o único motivo pelo qual alguns códigos exigem que o Java 6 seja compilado. Não tenho certeza se vale a pena.
fonte
Lendo o javadoc em java8, você pode encontrar o seguinte na declaração da interface Override:
Se um método for anotado com esse tipo de anotação, os compiladores serão necessários para gerar uma mensagem de erro, a menos que pelo menos uma das seguintes condições seja mantida:
Portanto, pelo menos no java8, você deve usar o @Override na implementação de um método de interface.
fonte
O próprio Eclipse adicionará a
@Override
anotação quando você instruir a "gerar métodos não implementados" durante a criação de uma classe que implementa uma interface.fonte
O problema de incluir o
@Override
é que isso faz você pensar que esqueceu de chamar osuper.theOverridenMethod()
método, o que é muito confuso . Isso deve ficar claro como cristal. Talvez o Java deva oferecer um@Interface
para ser usado aqui. Oh, bem, mais uma peculiaridade Java meia-boca ...fonte
No java 6 e versões posteriores, você pode usar
@Override
um método para implementar uma interface.Mas não acho que faça sentido: substituir significa que você tem um método na superclasse e está implementando-o na subclasse.
Se você está implementando uma interface, acho que devemos usar
@Implement
ou algo mais, mas não o@Override
.fonte
Para a interface, usar @Override causou erro de compilação. Então, eu tive que removê-lo.
A mensagem de erro foi "
The method getAllProducts() of type InMemoryProductRepository must override a superclass method
".Também leu "
One quick fix available: Remove @Override annotation.
"Estava no Eclipse 4.6.3, JDK 1.8.0_144.
fonte
Se a classe que está implementando o
interface
for umaabstract
classe,@Override
é útil para garantir que a implementação seja para uminterface
método; sem@Override
umaabstract
classe seria apenas compilar bem mesmo se a assinatura método de implementação não corresponde ao método declarado nointerface
; ointerface
método incompatível permaneceria como não implementado. O documento Java citado por @Zhaoestá claramente se referindo a uma
abstract
super classe; uminterface
não pode ser chamado de supertipo. Portanto,@Override
é redundante e não é sensato parainterface
implementações de métodos em classes concretas.fonte