Как объявить обобщенный класс c, расширяющий аннотацию - PullRequest
0 голосов
/ 28 января 2020

Я работаю над процессором аннотаций и передаю своему классу параметр, представляющий аннотацию для управления, что-то вроде: Class<? extends @interface> annotationClass

К сожалению, это не компилируется. Единственный способ, которым я могу скомпилировать, это использовать необработанный тип Class, но таким образом, когда я пытаюсь что-то вроде

roundEnvironment.getElementsAnnotatedWith(annotationClass)

, возвращается тип Object вместо javax.lang.model.element.Element

public Map<ClassName, List<ElementInfo>> initClassesToGenerate(Class annotationClass, ElementKind elementKind, RoundEnvironment roundEnvironment) {

        Map<ClassName, List<ElementInfo>> result = new HashMap<>();

        // init map

        for (Element annotatedElement : roundEnvironment.getElementsAnnotatedWith(annotationClass)) {

            TypeElement typeElement = (TypeElement) annotatedElement;
            ClassName className = ClassName.get(typeElement);
            if (!result.containsKey(className)) {
                result.put(className, new ArrayList<>());
            }
        }

        return result;
}

1 Ответ

2 голосов
/ 28 января 2020

Вы можете использовать <T extends Annotation>. Затем вы можете использовать Class<T> для ссылки на классы аннотаций.

...