Я только что сделал тест и понял, что неправильно истолковал документацию. Он возвращает NoType с добрым NONE для java.lang.Object и интерфейсов, а не для чего-то неявно расширяющего Object. Дурак я. Я не буду нуждаться в проверке, поскольку предыдущий проверяет, является ли аннотированный элемент классом в строгом смысле (не перечисление или интерфейс), и будет возвращать, если это так. Другими словами, проверка того, является ли каноническое имя java.lang.Object или, возможно, использование Types.isSameType
, должна помочь.
Извините, ребята. Я решил не удалять, так как другие могут прийти с тем же вопросом. Вы можете проголосовать за удаление, если считаете, что это уместно.
РЕДАКТИРОВАТЬ: Вот что я в конце концов пошел с ...
boolean superTypeValid = true;
final TypeMirror parent = el.getSuperClass();
if(!parent.getKind().equals(TypeKind.DECLARED)) {
messager.printMessage(Kind.ERROR, "May only inherit from a class; not enums, annotations or other declared kinds.", annotatedElement, mirror);
superTypeValid = false;
} else {
final DeclaredType parentType = (DeclaredType)parent;
final Element parentEl = parentType.asElement();
if(!parentEl.getKind().equals(ElementKind.CLASS)) {
messager.printMessage(Kind.ERROR, "May only inherit from a class; not enums, annotations or other declared kinds.", annotatedElement, mirror);
superTypeValid = false;
}
}
...
if(superTypeValid) {
if(typeUtils.isSameType(parent, elUtils.getTypeElement("java.lang.Object").asType())) {
messager.printMessage(Kind.ERROR, "Inherit must not be set to true if the class doesn't extend.", annotatedElement, mirror);
valid = false;
} else {
...
}
}
Если некоторые из этих сообщений об ошибках кажутся странными, это потому, что я пропустил некоторые специфичные для проекта вещи.