2010-02-25 16 views
50

Eclipse agrega anotaciones @Override cuando implemento los 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 comandos, con javac correr hormiga, me sale este error:Por qué está fallando Java en la anotación @Override

[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 con Java 1.6. Cruise Control ejecuta Java 1.5. Mi compilación de hormigas falla independientemente de la versión de Java que use.

Respuesta

99

La especificación de la anotación @Override ha cambiado 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 un blog post here.. Es was not well documented, 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, 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.

Here's a screenshot of changing the compiler in eclipse

+6

Esta es una gran respuesta; Tengo algo que agregar: si por alguna razón quieres permanecer en JDK 1.5, solo tienes que actualizar a la última versión de actualización. Estoy usando u21 y compila este tipo de @Overrides muy bien. –

+1

Cool - Lo agregaré a mi respuesta. –

+6

Instalé tanto JDK 1.5u21 como 1.5u22 y javac no permite @Override en implementaciones de métodos de interfaz en ninguna versión. A continuación, MyRunnable implementa java.lang.Runnable: c: /Java/jdk/1.5.0_21/bin/javac MyRunnable.java MyRunnable.java:3: método no anula un método de su superclase @ Override public void run() {} ^ 1 error No se menciona en el [notas de la versión] (http://java.sun.com/j2se/1.5.0/ReleaseNotes.html), tampoco. – djb

16

Realmente no puedo explicar el problema que se está viendo, pero parece estar relacionada con el hecho de que JDK 5 no permitirá @Override de métodos implementados de una interfaz, sólo en métodos sobrescritos presentes en una super clase.

JDK 6 permitirá @Override en cualquiera de ellos.

Si su construcción ant falla, puede estar pasando un parámetro source a javac, solicitando conformidad con JDK 5.

3

Las etiquetas @verride para los 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. Leer más here y here.

0

Eclipse podría estar apuntando a 1.6 versión de Java en lugar de 1,5. See here para configurar la versión java en eclipse.

3

La respuesta directa a la pregunta "¿Por qué" se produce un error por javac cuando @Override se utiliza en el contexto de una implementación del método es en realidad en las especificaciones de Java:

"The rationale for this is that a concrete class that implements an interface will necessarily override all the interface's methods irrespective of the @Override annotation, and so it would be confusing to have the semantics of this annotation interact with the rules for implementing interfaces."

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

Pero al parecer, alguien cambió de opinión para java 1.6 y 1.5 u21 ...

0

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

Ejemplo: HttpServletRequest

Esta es una interfaz con diferentes características dependiendo del proveedor.

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

0

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

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

a:

javac.compiler=modern 

que solucionó el problema y el proyecto quedó compilado y desplegado con éxito.

Cuestiones relacionadas