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 ...
Mucha gente, incluyéndome a mí, quedó atrapada por esto. Vea aquí para una discusión SO más grande
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.