tutorial referencia nuevo novedades metodos lista expresiones clases java eclipse java-8 java-7 eclipse-jdt

referencia - novedades java 10



Las anotaciones de los métodos de interfaz se heredan en Java 7 pero no en Java 8. (2)

Para el compilador eccl de Eclipse esto se parece al error 495396 Eclipse que hace referencia a JDK 6695379.

Está marcado como objetivo de 4.7, pero 4.7 ya está en estado de candidato de lanzamiento, así que supongo que no entró.

Estoy migrando de Java 7 a Java 8 y me he encontrado con este cambio en el idioma.

Tengo una superinterfaz con un método anotado:

public interface SuperInterface { @X SuperInterface getSomething(); }

Tengo una subinterfaz con el mismo método anotado pero devolviendo una sub-interfaz:

public interface SubInterface extends SuperInterface { @X SubInterface getSomething(); }

Cuando ejecuto esta prueba, falla en Java 8 pero no en Java 7:

import java.lang.reflect.Method; public class Test { public static void main(String[] args) { final Method[] methods = SubInterface.class.getMethods(); for (Method method : methods) { if (method.getAnnotations().length == 0) { throw new RuntimeException("No annotations found for " + method); } } } }

Las anotaciones de los métodos de interfaz se heredan en Java 7 pero no en Java 8, ¿es cierto?

@X se define como:

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface X { }


Por lo que sé, debería funcionar al menos con la compilación 94 de Java-8, de acuerdo con this . Por lo tanto, este es un error del compilador de eclipse (no puedo reproducirlo con javac ).

Está utilizando la covarianza aquí y, como tal, se generarán dos métodos (uno es un puente):

for (Method method : methods) { if (method.getAnnotations().length == 0) { System.out.println("Not present " + method.getName() + " isBridge? " + method.isBridge()); } else { System.out.println("Present :" + method.getName() + " isBridge? " + method.isBridge()); } }

Pero, de nuevo, esto debería funcionar, ya que el error dice claramente: las anotaciones con retención en tiempo de ejecución deben ser copiadas por javac a los métodos de puente .

Salida con javac :

Present :getSomething isBridge? false Present :getSomething isBridge? true

Salida con eclipse compiler :

Present :getSomething isBridge? false Not present getSomething isBridge? true