Я никогда не использовал этот материал, только читал об этом.
Я считаю, что вы можете перебирать возвращаемые типы и использовать Types#isAssignable(TypeMirror t1, TypeMirror t2)
, чтобы проверить, может ли кто-либо из них назначаться для интерфейса, который вы ищете (в этом контексте a присваивается b, если a является b или b, является суперинтерфейсом a - но для полного определения см. JLS section 5.2). Что-то вроде:
public static boolean implementsInterface (TypeElement myTypeElement, TypeMirror desiredInterface) {
for (TypeMirror t : myTypeElement.getInterfaces())
if (processingEnv.getTypeUtils().isAssignable(t, desiredInterface))
return true;
return false;
}
Или, что еще лучше, прямо, как это (возможно):
public static boolean implementsInterface (TypeElement myTypeElement, TypeMirror desiredInterface) {
return processingEnv.getTypeUtils().isAssignable(myTypeElement.asType(), desiredInterface);
}
Где processingEnv
является ProcessingEnvironment
(см комментарий ThePyroEagle по ниже).
Извините, я не могу проверить это, и снова, я просто основываю documentation. Вы должны проверить их самостоятельно.
Надеюсь, что это поможет.
является проблемой для итерации по всем интерфейсам, и если ни один mach - не возвращает false? – msangel
Да, потому что он может косвенно реализовать интерфейс, а 'getInterfaces()' возвращает только те, которые он непосредственно реализует. Я мог рекурсивно изучить все интерфейсы, но я надеялся на что-то более чистое. – kmon
Мне пришлось бы рекурсивно исследовать интерфейсы и супертип, а затем проверить супертипы супертипов и интерфейсы, и это довольно грязно – kmon