В настоящее время я сталкиваюсь с проблемой с аннотациями стирания Java-типа общего вида и времени выполнения, и я не уверен, что я делаю что-то неправильно или это ошибка в компиляторе Java. Рассмотрим следующий минимальный рабочий пример:
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
}
public interface MyGenericInterface<T> {
void hello(T there);
}
public class MyObject {
}
public class MyClass implements MyGenericInterface<MyObject> {
@Override
@MyAnnotation
public void hello(final MyObject there) {
}
}
Теперь, когда я запрашиваю информацию о MyClass.hello с отражением, я ожидаю, что метод hello все еще имеет аннотацию, однако это не так:
public class MyTest {
@Test
public void testName() throws Exception {
Method[] declaredMethods = MyClass.class.getDeclaredMethods();
for (Method method : declaredMethods) {
Assert.assertNotNull(String.format("Method '%s' is not annotated.", method), method
.getAnnotation(MyAnnotation.class));
}
}
}
Сообщение об ошибке (неожиданное) выглядит следующим образом:
java.lang.AssertionError: метод 'public void test.MyClass.hello(java.lang.Object) 'не аннотируется.
Протестировано с помощью Java 1.7.60.