Java注释处理器:检查TypeMirror是否实现特定的通用接口

Are*_*eSo 5 java generics annotations annotation-processing

我正在编写注释处理器,我需要检查特定是否TypeMirror实现特定接口。Java 注解处理器:检查 TypeMirror 是否实现特定接口这一问题为非泛型接口提供了答案。但它不适用于通用接口,例如String正在实现Comparable<String>- 并且使用 isAssignable 的代码不起作用。

此代码按预期工作:

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
Run Code Online (Sandbox Code Playgroud)

但这段代码没有:

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
Run Code Online (Sandbox Code Playgroud)

我认为原因是,“可比较”的 TypeElement 是用 String 作为通用参数定义的,但我不知道如何解决它。

Dea*_* Xu 7

Elements.getTypeElement返回实际类型Comparable<T>String不可分配给或Comparable<T>,但可以分配给。所以最简单的方法就是通过 擦除泛型类型。Comparable<String>ComparableTypes.erasure(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
Run Code Online (Sandbox Code Playgroud)