Аннотации методов интерфейса наследуются в Java 7, но не в Java 8

Im мигрирует с Java 7 на Java 8, и я встретил это изменение в языке.

у меня есть Суперинтерфейс с аннотированным методом:

public interface SuperInterface {

  @X
  SuperInterface getSomething();
}

у меня есть Подинтерфейс с тем же аннотированным методом, но возвращающим подинтерфейс:

public interface SubInterface extends SuperInterface {

  @X
  SubInterface getSomething();
}

когда я запускаю этот тест, он не в Java 8, но не в 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);
      }
    }
  }
}

аннотации методов интерфейса наследуются в Java 7, но не в Java 8, это правда?

@X is определяется как:

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 {  
}

2 ответов


насколько я могу сказать, он должен работать с at меньше построить 94 java-8, в соответствии с этой. Таким образом это ошибка компилятора eclipse (я не могу воспроизвести его с javac).

вы используете ковариацию здесь, и как таковой будет создано два метода (один-мост):

 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());
        }
    }

но опять же это должно работать, так как ошибка явно говорит : аннотация с сохранением времени выполнения должна быть скопирована javac в методы моста.

выход с javac:

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

выход с eclipse compiler:

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

для компилятора Eclipse ecj это выглядит как ошибка Eclipse 495396 который ссылается на JDK 6695379.

он отмечен как целевой для 4.7, но 4.7 уже находится в статусе кандидата на выпуск, поэтому я думаю, что он не попал.