Java 注释处理器:检查 TypeMirror 是否实现了特定的通用接口
Java Annotation Processor: check if TypeMirror implements specific generic interface
我正在编写注释处理器,我需要检查特定 TypeMirror
是否实现了特定接口。
问题 Java Annotations Processor: Check if TypeMirror implements specific interface 为非通用接口提供了答案。
但它不适用于通用接口,例如 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
但是这段代码没有:
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
我认为,原因是 'comparable' TypeElement 是用 String 作为泛型参数定义的,但我不知道如何绕过它。
Elements.getTypeElement
returns 实际类型 Comparable<T>
。 String
不可分配给 Comparable<T>
但可分配给 Comparable<String>
或 Comparable
。所以最简单的方法是通过 Types.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
我正在编写注释处理器,我需要检查特定 TypeMirror
是否实现了特定接口。
问题 Java Annotations Processor: Check if TypeMirror implements specific interface 为非通用接口提供了答案。
但它不适用于通用接口,例如 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
但是这段代码没有:
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
我认为,原因是 'comparable' TypeElement 是用 String 作为泛型参数定义的,但我不知道如何绕过它。
Elements.getTypeElement
returns 实际类型 Comparable<T>
。 String
不可分配给 Comparable<T>
但可分配给 Comparable<String>
或 Comparable
。所以最简单的方法是通过 Types.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