Podczas uzyskiwania TypeElement
w procesorze adnotacji można poprosić o jego superklasę (a dokładniej o TypeMirror
) przy użyciu metody getSuperClass()
. According to the JavaDoc, typ, który niczego nie rozszerza (innymi słowy, Object
jest superklasą) lub jest to interfejs, który zwróci z NONE
jako TypeKind
.Sprawdzanie nieobecności super klasy w procesorze adnotacji
Pomijając fakt, że cały model/lustrzany interfejs API wydaje się wychodzić z siebie, by dezorientować przy każdej okazji przez chwilę, w jaki sposób mógłbym to sprawdzić? Oto kilka fragmentów kodu:
//Cast is safe since TypeKind is checked before this
final TypeElement el = (TypeElement)annotatedElement;
...
final TypeMirror parent = el.getSuperclass();
//Checking whether "nothing" is extended
if(parent.getKind().equals(TypeKind.NONE) && parent instanceof NoType) {
...
}
Czy to właściwy sposób? Wydaje się raczej niezgrabne. Ponieważ equals
method of TypeMirror nie powinno być używane do semantycznych kontroli równości, zastanawiam się, czy można go bezpiecznie używać do TypeKind
. Moje przeczucie mówi "tak", ponieważ jest to wyliczenie, ale wtedy mam wątpliwości co do tego, instanceof
.
Czy jest lepszy sposób to zrobić? Cały pakiet javax.lang.model i jego dzieci mają odnośniki w całym sklepie i nigdy nie jest dla mnie jasne, jaka jest najlepsza metoda. Istnieją użyteczne metody użytkowe dla niektórych rzeczy, a następnie są pozornie proste zadania, które wymagają wątpliwych akrobacji, takich jak powyższe.