首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java语言规范版本11第4.10.2节中,包含通配符的参数化类型是否确实没有直接的超级类型?

在Java语言规范版本11第4.10.2节中,包含通配符的参数化类型是否确实没有直接的超级类型?
EN

Stack Overflow用户
提问于 2021-10-11 17:11:34
回答 2查看 97关注 0票数 1

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节有关部分的解读是:

  • “参数化类型C,其中Tᵢ(1≤i≤n)是一种类型”具有各种类型的直接超型。
  • …但是是一个参数化类型C,其中至少有一个Tₙ是通配符,具有 no 直接超级类型
    • …因为本节中列出的规则不完全或部分适用于包含至少一个通配符…的参数化类型。
      • …因为通配符不是类型,所以永远不满足"where Tᵢ(1≤i≤n)是类型“条件。

这是正确的读数吗?换句话说,我的演绎推理是否正确?

(顺便指出,有些类型可以“包含”包含通配符的参数化类型(如第4.5.1节界定)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-11 17:31:16

您引用的部分实际上没有提到至少有一个通配符类型参数的参数化类型。它们的直接超级类型是在您引用的部分之后指定的:

给定泛型类型声明C (n > 0),参数化类型C的直接超类型(其中至少有一个Ri (1≤i≤n)是通配符类型参数)是参数化类型C的直接超级类型,这是将捕获转换应用到C (第5.1.10条)的结果。

基本上,要找到具有至少一个通配符类型参数的类型的直接超级类型,首先应用捕获转换,然后您将得到一个参数化类型,该类型只作为类型参数,因为捕获转换将通配符转换为类型变量。在此之后,您可以使用您引用的规则来查找其超级类型。

票数 4
EN

Stack Overflow用户

发布于 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中的原始类型:原始类型是泛型接口或类的名称,没有其类型参数:

代码语言:javascript
复制
List list = new ArrayList(); // raw type

而不是:

代码语言:javascript
复制
List<Integer> listIntgrs = new ArrayList<>(); // parameterized type

因此,它不是JAVA中典型类型的类型:原语或引用类型,但它是编译器有规则并知道如何处理的一种特殊类型。这是否意味着它真的不是一种类型?我会说不,它是一种psuedo类型或未知类型,因为没有更好的词,因为它可以声明和使用,而不知道它的类型。

因此,它本身不会有一个超级类型。

但是参数化类型C,其中至少有一个Tₙ是通配符,没有直接的超级类型…

但是,正如@Sweeper所指出的,如果您有至少一个通配符类型参数的参数化类型,那么您可以使用捕获转换找到超级类型。

我在SO:什么是Java中的捕获转换,有人能给我举一些例子吗?上找到了捕获转换的定义

捕获转换允许编译器为捕获的通配符创建占位符类型名称,这样类型推断就可以推断为该类型。

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

https://stackoverflow.com/questions/69530080

复制
相关文章

相似问题

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