una - variables en interfaces java




¿Debemos anular la implementación del método de una interfaz? (10)

¿Debería anotarse un método que implementa un método de interfaz con @Override ?

El javadoc de la anotación de Override dice:

Indica que una declaración de método está destinada a 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?

Elaboración de la pregunta


Al leer el javadoc en java8, puede encontrar lo siguiente en la declaración de interfaz Override:

Si se anota un método con este tipo de anotación, los compiladores deben generar un mensaje de error a menos que se cumpla al menos una de las siguientes condiciones:

  • El método anula o implementa un método declarado en un supertipo.
  • El método tiene una firma que es anulada equivalente a la de cualquier método público declarado en {@linkplain Object}.

Entonces, al menos en java8, debe usar @Override en una implementación de un método de interfaz.


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á usando 1.6, me gustaría hacerlo.


Eclipse agregará la anotación @Override cuando le diga que "genere métodos no implementados" durante la creación de una clase que implementa una interfaz.


El problema de incluir @Override es que te hace pensar que te olvidaste de llamar al método super.theOverridenMethod() , que es muy confuso . Esto debería ser claro como el cristal. Quizás Java debería ofrecer un @Interface para ser usado aquí. Oh, bueno, otra peculiaridad de Java a medias ...


JDK 5.0 no le permite usar la anotación @Override si está implementando un método declarado en la interfaz (su error de compilación), pero JDK 6.0 lo permite. Por lo tanto, puede configurar su preferencia de proyecto de acuerdo con sus requerimientos.


La anulación de sus propios métodos heredados de sus propias clases no se usará para refactorizar el uso de un ide. Pero si reemplaza un método heredado de una biblioteca, se recomienda utilizarlo. Si no lo hace, a menudo no obtendrá ningún error en un cambio posterior de la biblioteca, sino un error bien oculto.


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.


Para la interfaz, el uso de @Override provocó un error de compilación. Por lo tanto, tuve que quitarlo.

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. " One quick fix available: Remove @Override annotation.

Estaba en Eclipse 4.6.3, JDK 1.8.0_144.


Si una clase concreta no está anulando un método abstracto, usar @Override para la implementación es un asunto abierto ya que el compilador le avisará invariablemente de cualquier método no implementado. En estos casos, se puede argumentar que resta valor a la legibilidad: hay más cosas que leer en su código y, en menor grado, se llama @Override y no @Implement .


Siempre debe anotar métodos con @Override si está disponible.

En JDK 5, esto significa reemplazar métodos de superclases, en JDK 6 y 7 significa reemplazar métodos de superclases e implementar métodos de interfaces. La razón, como se mencionó anteriormente, es que le permite al compilador detectar errores cuando cree que está anulando (o implementando) un método, pero en realidad está definiendo un nuevo método (firma diferente).

El ejemplo de equals(Object) vs. equals(YourObject) es un caso estándar en este punto, pero se puede hacer el mismo argumento para las implementaciones de interfaz.

Me imagino que la razón por la que no es obligatorio anotar los métodos de implementación de las interfaces es que JDK 5 marcó esto como un error de compilación. Si JDK 6 hizo esta anotación obligatoria, rompería la compatibilidad hacia atrás.

No soy un usuario de Eclipse, pero en otros IDE (IntelliJ), la anotación @Override 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 anotación de @Implements .





annotations