2013-08-13 4 views
4

Метод getInterfaces()TypeElement возвращает интерфейсы, непосредственно реализованные элементом. Есть ли простой способ найти, если данный TypeElement косвенно реализует данный интерфейс?Как определить, косвенно ли TypeElement реализует интерфейс

Это скажем, у меня есть TypeElement, и я хочу знать, находится ли где-то вверх по линии, с которой он спускается с данного интерфейса.

+0

является проблемой для итерации по всем интерфейсам, и если ни один mach - не возвращает false? – msangel

+0

Да, потому что он может косвенно реализовать интерфейс, а 'getInterfaces()' возвращает только те, которые он непосредственно реализует. Я мог рекурсивно изучить все интерфейсы, но я надеялся на что-то более чистое. – kmon

+0

Мне пришлось бы рекурсивно исследовать интерфейсы и супертип, а затем проверить супертипы супертипов и интерфейсы, и это довольно грязно – kmon

ответ

4

Я никогда не использовал этот материал, только читал об этом.

Я считаю, что вы можете перебирать возвращаемые типы и использовать 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. Вы должны проверить их самостоятельно.

Надеюсь, что это поможет.

+0

Я проверю его, но это выглядит точно так, как я хочу. Благодаря! – kmon

+0

Сообщите мне, если это работает. Постскриптум К сожалению, я забыл покрыть обратные пути «false». Исправлена. –

+1

Метод не является статическим. Он должен быть 'processingEnv.getTypeUtils()' вместо 'Types', который является просто именем интерфейса. – ThePyroEagle