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

Eclipse agrega anotaciones @Override cuando implemento métodos de una interfaz. Eclipse parece no tener ningún problema con esto. Y nuestro proceso de comstackción automatizado de Cruise Control parece no tener ningún problema con esto. Pero cuando construyo desde la línea de comando, con la ant 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 comstackción de ants falla independientemente de la versión de Java que use.

La especificación de anotación @Override cambió en Java 1.6. En Java 1.5, el comstackdor 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 comstackció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á comstackndo 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 comstackdor (no javac) y ocasionalmente tendrá un comportamiento diferente. Cada vez que comstack algo en Eclipse, pero no Ant o Maven, tendrá que encontrar la forma de hacer felices a ambos comstackdores.

Aquí hay una captura de pantalla para cambiar el compilador en eclipse

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.

Las tags @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 aquí y aquí .

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 …

Mucha gente, incluyéndome a mí, quedó atrapada por esto. Vea aquí para una discusión SO más grande

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.

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.

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.