首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在朗模型中,TypeMirrors和元素的关系是什么?

在朗模型中,TypeMirrors和元素的关系是什么?
EN

Stack Overflow用户
提问于 2022-06-15 03:25:29
回答 1查看 55关注 0票数 0

(虽然这个问题是用annotation-processing标记的,但我实际上是在询问javax.lang.model公开的类型模型,不管是否涉及注释处理。)

javax.lang.model中,有两个基本结构:SS

TypeMirror。然而,只有特定的TypeMirror亚型,即DeclaredTypeTypeVariable,分别通过DeclaredType#asElement()TypeVariable#asElement()与它们相关联。

(因此,所有的Elements“都有”TypeMirrors,而不是所有的TypeMirrors“有”Elements“。)

从松散和直观的角度来说,这是有意义的:通过吟诵特定的Java咒语来声明类型:咒语本身就是(声明的)元素;它们所产生的东西就是支持它们的类型。我已经用Java编程了几十年,并且对像Foo implements Comparable<Foo>这样的奇怪的东西有很好的工作上的熟悉。我想在这里变得更严格。

考虑到所有这些,并考虑到下面的片段,javax.lang.model类型和元素是如何表现出来的?

代码语言:javascript
复制
// (Defined by the JDK itself of course.)
public interface Comparable<T> ...

// (My class.)
public class Frob implements Comparable<Frob> ...

我看到以下“事物”,从“顶”到“底”的工作越来越不确定:

代码语言:javascript
复制
- The return value of its [`getTypeParameters()` method](https://docs.oracle.com/en/java/javase/18/docs/api/java.compiler/javax/lang/model/element/TypeElement.html#getTypeParameters(%29) will consist solely of the `TypeParameterElement` discussed earlier.
  • 一个TypeElement,其附属Name等于"Frob“。
    • (这个TypeElement是与public class Frob ...语法一起产生的。)
    • 它的asType()方法的返回值将是一个(没有明确名称的) DeclaredType,其asElement()方法将返回当前正在讨论的TypeElement
    • 稍后将讨论其getInterfaces()方法的返回值。

  • 一种由“Element”粗略描述的品种的Comparable<Frob>
    • 我之所以说“有一些变化”,是因为正如所写的那样,它本身没有显式或隐含的extendsimplements子句,或者其他我希望看到的标记,比如TypeElement。不过,我不确定它是否是除Element之外的任何其他类型的TypeElement。也许它是一个TypeElement,与"Comparable<T>“所表示的相同,但是它的各种TypeMirror-returning或-referencing方法使用Frob表示的类型。
    • 它的asType()方法的返回值将是某种类型(几乎可以肯定是DeclaredType)的(确切无名的) TypeMirror,其asElement()方法将返回当前正在讨论的Element (这在某种程度上相当于运行时/反射模型中的java.lang.reflect.ParameterizedType )
      • 这样返回的TypeMirror将有一个类型的参数,它将是由DeclaredTypeasType()方法返回的,该方法的Name等于上面描述的"Frob
      • 这样返回的TypeMirror将是方法的返回值的唯一成员,当在TypeElement上调用其Name等于上面描述的"Frob“时。

到目前为止,我有这个权利吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-21 21:03:18

你的问题似乎很有道理,而且我找不到任何具体的错误向你指出,但是它缺少元素和TypeMirrors区别的一个重要真理。

元素表示驻留在“磁盘上”的Java类型AST中的节点-- rest代码,可以是.java文件,也可以是.class文件。以这种形式存在于磁盘上的任何类/接口/enum/记录器/注释都可以在某种程度上被发现。为了进一步了解,这些方法涵盖了上述任何类型的整个API -任何成员(字段/构造函数/方法或嵌套类型,然后这些方法/ctors的参数)和包也是由元素描述的。但是元素层次结构只覆盖磁盘上的类型--使用来自您的问题的一个具体示例,Comparable<T>及其Comparable<T>.compareTo(T)成员,该方法的参数就是这样覆盖的。是的,为了省略类型参数,类和方法都将类型param嵌入到它们各自的元素中-作为元素。

另一方面,TypeMirrors表示那些“正在使用”的元素--您不能在代码中对Comparable<T>进行真正的推理,而是要么原始地使用它(请不要使用),要么以某种特定的方式将它参数化(例如Comparable<Frob>Comparable<?>,或者可能是Comparable<T>,其中T是封闭元素的类型param,比如当前的方法或类)。这意味着T与上面的TypeElement不同--它不是磁盘上TypeElement的值,而是更具体的值。

您将在元素中找到TypeMirrors (例如,“出现在该类中的方法的返回类型是什么?”),所有元素都可以转换为某种形式的TypeMirror。另一方面,并不是所有的TypeMirrors都可以转换为某种元素(例如原语),或者如果可以的话,这种转换可能是“有损的”(例如,将TypeMirror of List<String>转换为元素只会给您提供List<T>本身)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72625582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档