2017-11-29 26 views
3

주석 처리기를 작성 중이며 특정 TypeMirror이 특정 인터페이스를 구현하는지 확인해야합니다. Java Annotations Processor: Check if TypeMirror implements specific interface 질문은 제네릭이 아닌 인터페이스에 대한 대답을 제공합니다. 그러나 일반적인 인터페이스에서는 작동하지 않습니다. 예를 들어 StringComparable<String>을 구현하고 있고 isAssignable을 사용하는 코드가 작동하지 않습니다.Java Annotation Processor : TypeMirror가 특정 제네릭 인터페이스를 구현하는지 확인하십시오.

TypeMirror tm = elementUtil.getTypeElement("java.lang.String").asType(); 
TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType(); 
boolean isSerializable = typeUtil.isAssignable(tm, serializable); 
//here isSerializable is true 

하지만이 코드는하지 않습니다 :

이 코드는 예상대로 작동

TypeMirror tm = elementUtil.getTypeElement("java.lang.String").asType(); 
TypeMirror comparable = elementUtil.getTypeElement("java.lang.Comparable").asType(); 
boolean isComparable = typeUtil.isAssignable(tm, comparable); 
//here isComparable is false 

생각, 이유는 '비교'TypeElement는 일반적으로 문자열로 정의되어 있는지이라고 매개 변수를 사용하지만 주위를 둘러 보는 방법을 모르겠습니다.

+0

'tm'을 정의하지 않았습니다. 스 니펫 대신 컴파일하고 실행할 수있는 전체 파일을 제공하면 다른 사람들이 문제를 이해하고 도움을 줄 수 있습니다. – mernst

+0

tm은 String 용 TypeMirror이며 추가되었습니다. – AreSo

답변

1

Elements.getTypeElement은 실제 유형 Comparable<T>을 반환합니다. StringComparable<T>에는 적합하지 않지만 Comparable<String> 또는 Comparable을 부탁드립니다. 따라서 가장 간단한 방법은 일반 유형을 지우기 (Types.ensure(TypeMirror))입니다.

TypeMirror tm = elements.getTypeElement("java.lang.String").asType(); 
TypeMirror comparable = types.erasure(elements.getTypeElement("java.lang.Comparable").asType()); 
boolean isComparable = types.isAssignable(tm, comparable); // return true