¿Se debe anotar un método que implemente un método de interfaz @Override
?
El javadoc de la Override
anotación dice:
Indica que una declaración de método tiene la intención de anular una declaración de método en una superclase. Si un método se anota con este tipo de anotación pero no anula un método de superclase, los compiladores deben generar un mensaje de error.
No creo que una interfaz sea técnicamente una superclase. ¿O es eso?
java
oop
interface
annotations
Benno Richters
fuente
fuente
Respuestas:
Debería usar @Override siempre que sea posible. Evita que se cometan errores simples. Ejemplo:
Esto no se compila porque no se anula correctamente
public boolean equals(Object obj)
.Lo mismo se aplicará a los métodos que implementan una interfaz ( 1.6 y superior solamente ) o anulan el método de una Súper clase.
fuente
Creo que el comportamiento de javac ha cambiado: con 1.5 prohibió la anotación, con 1.6 no. La anotación proporciona una verificación adicional en tiempo de compilación, por lo que si está utilizando 1.6, lo haría.
fuente
Siempre debe anotar métodos con
@Override
si está disponible.En JDK 5, esto significa anular métodos de superclases, en JDK 6 y 7 significa anular métodos de superclases e implementar métodos de interfaces. La razón, como se mencionó anteriormente, es que permite que el compilador detecte errores donde cree que está anulando (o implementando) un método, pero en realidad está definiendo un nuevo método (firma diferente).
El ejemplo
equals(Object)
vs.equals(YourObject)
es un ejemplo estándar, pero se puede hacer el mismo argumento para implementaciones de interfaz.Me imagino que la razón por la que no es obligatorio anotar la implementación de métodos de interfaces es que JDK 5 marcó esto como un error de compilación. Si JDK 6 hiciera esta anotación obligatoria, rompería la compatibilidad con versiones anteriores.
No soy un usuario de Eclipse, pero en otros IDEs (IntelliJ), la
@Override
anotación solo se agrega al implementar métodos de interfaz si el proyecto se configura como un proyecto JDK 6+. Me imagino que Eclipse es similar.Sin embargo, hubiera preferido ver una anotación diferente para este uso, tal vez una
@Implements
anotación.fuente
Lo usaría en cada oportunidad. Consulte ¿ Cuándo utiliza la anotación @Override de Java y por qué?
fuente
JDK 5.0 no le permite usar
@Override
anotaciones si está implementando un método declarado en la interfaz (su error de compilación), pero JDK 6.0 lo permite. Entonces, puede configurar su preferencia de proyecto de acuerdo con sus requisitos.fuente
Si una clase concreta no anula un método abstracto, el uso
@Override
para la implementación es una cuestión abierta ya que el compilador le advertirá invariablemente de cualquier método no implementado. En estos casos, se puede argumentar que resta valor a la legibilidad: es más cosas para leer en su código y, en menor grado, se llama@Override
y no@Implement
.fuente
Reemplazar sus propios métodos heredados de sus propias clases generalmente no se romperá en las refactorizaciones utilizando un ide. Pero si anula un método heredado de una biblioteca, se recomienda usarlo. Si no lo hace, a menudo no obtendrá ningún error en un cambio posterior de la biblioteca, sino un error bien oculto.
fuente
No es un problema con JDK. En Eclipse Helios, permite la anotación @Override para los métodos de interfaz implementados, cualquiera que sea JDK 5 o 6. En cuanto a Eclipse Galileo, la anotación @Override no está permitida, cualquiera que sea JDK 5 o 6.
fuente
Para mí, muchas veces esta es la única razón por la que algunos códigos requieren que Java 6 se compile. No estoy seguro si vale la pena.
fuente
Al leer el javadoc en java8, puede encontrar lo siguiente en la declaración de anulación de interfaz:
Si se anota un método con este tipo de anotación, se requiere que los compiladores generen un mensaje de error a menos que se cumpla al menos una de las siguientes condiciones:
Entonces, al menos en java8, debe usar @Override en una implementación de un método de interfaz.
fuente
Eclipse agregará la
@Override
anotación cuando le diga que "genere métodos no implementados" durante la creación de una clase que implemente una interfaz.fuente
El problema con la inclusión de
@Override
es que te hace pensar que olvidaste llamar alsuper.theOverridenMethod()
método, lo cual es muy confuso . Esto debería ser claro como el cristal. Quizás Java debería ofrecer un@Interface
para ser utilizado aquí. Oh, bueno, otra peculiaridad de Java a medias ...fuente
En java 6 y versiones posteriores, puede usar
@Override
un método para implementar una interfaz.Pero no creo que tenga sentido: anular significa que tiene un método en la superclase y lo está implementando en la subclase.
Si está implementando una interfaz, creo que deberíamos usar
@Implement
o algo más, pero no el@Override
.fuente
Para la interfaz, el uso de @Override provocó un error de compilación. Entonces, tuve que eliminarlo.
El mensaje de error fue "
The method getAllProducts() of type InMemoryProductRepository must override a superclass method
".También se lee "
One quick fix available: Remove @Override annotation.
"Estaba en Eclipse 4.6.3, JDK 1.8.0_144.
fuente
Si la clase que está implementando
interface
es unaabstract
clase,@Override
es útil para garantizar que la implementación sea para uninterface
método; sin@Override
unaabstract
clase simplemente se compilaría bien incluso si la firma del método de implementación no coincide con el método declarado eninterface
; elinterface
método no coincidente permanecería como no implementado. El documento de Java citado por @Zhaose refiere claramente a una
abstract
superclase; unainterface
no puede ser llamado el supertipo. Por lo tanto,@Override
es redundante y no es sensible parainterface
implementaciones de métodos en clases concretas.fuente