Java 注释处理器 : check if TypeMirror implements specific generic interface

标签 java generics annotations annotation-processing

我正在编写注释处理器,我需要检查是否有特定的 TypeMirror实现特定接口(interface)。 问题Java Annotations Processor: Check if TypeMirror implements specific interface为非通用接口(interface)提供答案。 但它不适用于通用接口(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

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

最佳答案

Elements.getTypeElement返回实际类型 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

关于Java 注释处理器 : check if TypeMirror implements specific generic interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47553977/

相关文章:

java - 查找并运行私有(private)注释方法的最简单方法是什么?

传递父类(super class)型的 Java 接口(interface)方法

java - 直接将 gcc 与 ProcessBuilder 一起使用不会创建输出文件

java - 参数化方法调用何时有用?

swift - 如何知道从 JSON 之类的东西实例化哪种类型?

java - 用抽象类方法解决Java泛型错误

java - 自定义 Facebook 登录以与 MethodChannel 一起使用

java - 如何在 servlet-context 中引用 bean 的属性?

rest - 在 Grails 中使用 @Resource 时打印 REST 调用接收到的数据

java - PdfBox - 使用获取字体信息