我有以下情况。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExampleAnnotation {}
public abstract class AbstractExample<T extends BeanInterface> {
public abstract void exampleMethod(T bean);
}
public class ImplementationExample extends AbstractExample<BeanImplementation>{
@Override
@ExampleAnnotation
public void exampleMethod(BeanImplementation bean) {
}
}
其中BeanImplementation是BeanInterface的实现。
如果我使用Java 8u45编译代码,并使用以下代码列出ImplementationExample
类的哪些方法具有注释ExampleAnnotation
:
Class<ImplementationExample> cls = ImplementationExample.class;
List<Method> methods = new ArrayList<Method>();
methods.addAll(Arrays.asList(cls.getDeclaredMethods()));
for (Method method : methods) {
System.out.println("method: " + method.getName() + " annotation: " + method.getAnnotation(ExampleAnnotation.class));
}
然后我得到了这两种方法:
ImplementationExample.exampleMethod(BeanImplementation)
ImplementationExample.exampleMethod(BeanInterface)
如果我使用Java 7或Java 8 Eclipse编译器,那么只注释第一个方法,这应该是正确的行为。
这是java 8编译器中的错误吗?或者我做错了什么?