В настоящее время я сталкиваюсь с проблемой с аннотациями стирания 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.