javax.lang.model中TypeMirror与Element的关系及实例验证
javax.lang.model中元素与类型的对应关系说明 你前三点梳理的内容完全准确,唯一的认知偏差是假设存在一个对应Comparable<Frob>的独立Element——这个元素根本不存在,这也是这套类型模型最容易踩的误区。
已确认正确的对应关系
- 对应
Comparable接口泛型形参T的TypeParameterElement:- 调用
asType()返回无绑定名称的TypeVariable,对该TypeVariable调用asElement()会直接返回当前这个TypeParameterElement - 调用
getGenericElement()、getEnclosingElement()的返回值,都是代表Comparable接口声明的TypeElement
- 调用
- 对应
Comparable接口的TypeElement:- 调用
asType()返回声明侧的泛型DeclaredType(即带形参T的原始泛型类型),对该DeclaredType调用asElement()会直接返回当前这个Comparable对应的TypeElement - 该
DeclaredType调用getTypeArguments()返回的唯一元素,就是前面提到的代表T的TypeVariable - 自身调用
getTypeParameters()返回的唯一元素,就是前面提到的对应T的TypeParameterElement
- 调用
- 对应自定义类
Frob的TypeElement:- 由源码中
public class Frob的声明产生,调用asType()返回代表Frob类本身的无类型参数DeclaredType,对该DeclaredType调用asElement()会直接返回当前这个Frob对应的TypeElement
- 由源码中
认知纠偏:Comparable<Frob>只是类型使用实例,不存在对应独立元素
你描述的Comparable<Frob>结构只是一个DeclaredType类型的TypeMirror,没有任何独立的Element与其对应,这和反射包中ParameterizedType的逻辑完全一致:参数化类型是已有泛型声明的使用形态,不是一个需要单独定义的新声明。
关于这个Comparable<Frob>类型的细节:
- 它确实是
Frob对应的TypeElement调用getInterfaces()返回的唯一元素,类型为DeclaredType - 它调用
getTypeArguments()返回的唯一元素,就是Frob类asType()返回的、代表Frob本身的DeclaredType - 当你对这个参数化的
DeclaredType调用asElement()时,返回的就是前面提到的、代表原始Comparable接口声明的那个TypeElement,全程不会生成新的Element对象
快速判断规则
判断一个结构是不是Element的标准非常简单:凡是你写Java源码时需要单独写声明语句定义的结构,才会是Element——类、接口、方法、字段、泛型形参、包、枚举值这些都属于这个范畴。而参数化类型(比如Comparable<Frob>、List<String>)、数组类型、基本类型、通配符类型这些都只是类型的使用方式,不需要单独写声明定义,因此都只是TypeMirror,不会对应独立的Element,它们调用asElement()时只会返回其基于的原始声明对应的元素。
比如你在代码里写List<String>时,从来不需要单独声明一个叫List<String>的新接口,只是在使用已经声明好的List接口,把它的形参替换成String而已,因此List<String>只是一个TypeMirror,它的asElement()永远返回List接口对应的TypeElement。
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

