variable sobreescribir que método metodos funciona como anotacion java annotations

sobreescribir - Por qué javac falla en la anotación @Override



sobreescribir un método (8)

Asegúrese de que solo haya una definición de esa interfaz.

Ejemplo: HttpServletRequest

Esta es una interfaz con diferentes especificaciones dependiendo del proveedor.

Compara pax-web-jetty y apache-felix-jetty. Ellos tienen diferentes métodos.

Eclipse agrega anotaciones @Override cuando implemento métodos de una interfaz. Eclipse parece no tener ningún problema con esto. Y nuestro proceso de compilación automatizado de Cruise Control parece no tener ningún problema con esto. Pero cuando construyo desde la línea de comando, con la hormiga corriendo javac, obtengo este error:

[javac] C:/path/project/src/com/us/MyClass.java:70: method does not override a method from its superclass [javac] @Override [javac] ^ [javac] 1 error

Eclipse se ejecuta bajo Java 1.6. Cruise Control ejecuta Java 1.5. Mi compilación de hormigas falla independientemente de la versión de Java que use.


Eclipse estaría apuntando a la versión 1.6 de Java en lugar de 1.5. Vea aquí para configurar la versión java en eclipse.


He tenido el mismo problema al construir un proyecto con ANT. La solución al problema fue cambiar la siguiente propiedad dentro del archivo build.properties:

javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

a:

javac.compiler=modern

Eso resolvió el problema y el proyecto se compiló e implementó con éxito.


La especificación de anotación @Override cambió en Java 1.6. En Java 1.5, el compilador no permitió la anotación @Override en los métodos de interfaz implementados, pero en 1.6 sí lo hace. El primer resultado de búsqueda que encontré es una publicación de blog aquí. . No estaba bien documentado , pero sí cambió.

Eclipse lo agrega porque su Eclipse está configurado para cumplimiento 1.6 ... debe intentar mantener sus entornos de compilación y eclipse en la misma versión de Java. No me queda claro si especifica que Cruise Control está ejecutando Java 5 con independencia de si está compilando o no con un JDK6 separado.

Separado de las reglas de anotación anteriores de 1.5 vs 1.6 @Override, recuerde que Eclipse tiene su propia implementación de compilador (no javac) y ocasionalmente tendrá un comportamiento diferente. Cada vez que compila algo en Eclipse, pero no Ant o Maven, tendrá que encontrar la forma de hacer felices a ambos compiladores.


La respuesta directa a la pregunta "Por qué" javac genera un error cuando se utiliza @Override en el contexto de una implementación de método está realmente en las especificaciones de Java:

"La razón de esto es que una clase concreta que implementa una interfaz necesariamente anulará todos los métodos de la interfaz independientemente de la anotación @Override, por lo que sería confuso tener la semántica de esta anotación interactuando con las reglas para implementar interfaces".

Ver http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

Pero aparentemente alguien cambió de idea para Java 1.6 y 1.5 u21 ...


Las etiquetas @Override para métodos implementados son nuevas para Java 1.6. En Java 1.5, @Override solo es correcto al anular un método en una clase base. Lea más here y here .



Realmente no puedo explicar el problema que está viendo, pero parece estar relacionado con el hecho de que JDK 5 no permitirá @Override en los métodos implementados de una interfaz , solo en los métodos reemplazados presentes en una súper clase .

JDK 6 permitirá @Override en cualquiera de ellos.

Si tu construcción ant falla, puede estar pasando un parámetro source a javac, solicitando el cumplimiento de JDK 5.