在Java语言规范,版本11,第4.10.2节中,部分内容是在讨论参数化类型的直接超级类型时读取的:
给定泛型类型声明C (n > 0),参数化类型C,,其中Tᵢ(1≤I≤n)是一种,全部如下:
(然后,它列出了一组适用于此类参数化类型的规则。这些规则大多与这个问题无关。它们之所以相关,只是因为它们为某些参数化类型的情况定义了直接的超级类型。)
什么是“是类型”的意思可以找到在4.1节的顶部
Java编程语言中有两种类型:基元类型(§4.2)和引用类型(§4.3)。
引用类型(我们在这里不讨论原语,这是肯定的) ArrayType。
因此通配符不是一种类型。
(它是TypeArgument。你可能会像我曾经做过的那样模棱两可地认为通配符是一种摇摇欲坠的TypeVariable,因此也是一种类型,但是你就错了。
因此,综上所述,我对第4.10.2节有关部分的解读是:
这是正确的读数吗?换句话说,我的演绎推理是否正确?
(顺便指出,有些类型可以“包含”包含通配符的参数化类型(如第4.5.1节界定)。
发布于 2021-10-11 17:31:16
您引用的部分实际上没有提到至少有一个通配符类型参数的参数化类型。它们的直接超级类型是在您引用的部分之后指定的:
给定泛型类型声明C (n > 0),参数化类型C的直接超类型(其中至少有一个Ri (1≤i≤n)是通配符类型参数)是参数化类型C的直接超级类型,这是将捕获转换应用到C (第5.1.10条)的结果。
基本上,要找到具有至少一个通配符类型参数的类型的直接超级类型,首先应用捕获转换,然后您将得到一个参数化类型,该类型只作为类型参数,因为捕获转换将通配符转换为类型变量。在此之后,您可以使用您引用的规则来查找其超级类型。
发布于 2021-10-11 17:51:33
通配符是JAVA中的类型,它们是“存在类型”。从您的同一链接页面:
通配符与已建立的类型理论之间的关系是一个有趣的关系,我们在这里简要地提到它。通配符是存在类型的一种受限形式。给定一个泛型类型声明G,G大致类似于某些X <:B.G。
另外:
原始类型与通配符密切相关。两者都是基于存在主义类型。原始类型可以被认为是通配符,其类型规则故意不健全,以适应与遗留代码的交互。历史上,原始类型先于通配符;它们最初是在GJ中介绍的,并在论文“为过去的安全”中描述: Gilad Bracha、Martin Odersky、David Stoutamire和Philip Wadler在1998年10月举行的ACM面向对象编程、系统、语言和应用程序会议(OOPSLA 98)中向Java编程语言添加了泛泛性。
存在类型向调用方隐藏其实现中的类型。若X在T中是存在的,则不能从任何调用对象中知道X的恒等式。已知的是定义中提供的一组操作。
Java中的原始类型:原始类型是泛型接口或类的名称,没有其类型参数:
List list = new ArrayList(); // raw type而不是:
List<Integer> listIntgrs = new ArrayList<>(); // parameterized type因此,它不是JAVA中典型类型的类型:原语或引用类型,但它是编译器有规则并知道如何处理的一种特殊类型。这是否意味着它真的不是一种类型?我会说不,它是一种psuedo类型或未知类型,因为没有更好的词,因为它可以声明和使用,而不知道它的类型。
因此,它本身不会有一个超级类型。
但是参数化类型C,其中至少有一个Tₙ是通配符,没有直接的超级类型…
但是,正如@Sweeper所指出的,如果您有至少一个通配符类型参数的参数化类型,那么您可以使用捕获转换找到超级类型。
我在SO:什么是Java中的捕获转换,有人能给我举一些例子吗?上找到了捕获转换的定义
捕获转换允许编译器为捕获的通配符创建占位符类型名称,这样类型推断就可以推断为该类型。
https://stackoverflow.com/questions/69530080
复制相似问题