【发布时间】:2021-11-30 10:23:36
【问题描述】:
在the Java Language Specification, version 11, section 4.10.2 中,部分内容是在讨论参数化类型的直接超类型时:
给定泛型类型声明 C
(n > 0),参数化类型 C 的直接超类型,其中 Tᵢ (1 ≤ i ≤ n)是一个类型,都是以下几种:
(然后它列出了一系列适用于此类参数化类型的规则。这些规则与这个问题几乎无关。它们的相关性仅在于它们为某些参数化类型定义了直接超类型。)
“是类型”是什么意思可以查到at the top of section 4.1:
Java 编程语言中有两种类型:原始类型(第 4.2 节)和引用类型(第 4.3 节)。
一个引用类型(我们在这里不是在谈论原语,这是肯定的)is simply a ClassOrInterfaceType, a TypeVariable or an ArrayType。
因此通配符不是一种类型。
(它是is, in fact, a kind of TypeArgument。你可能会像我曾经做过的那样模糊而天真地认为通配符是一种不稳定的TypeVariable,因此是一种类型,但you would be incorrect。)
因此,将所有这些放在一起,我对第 4.10.2 节相关部分的阅读是:
- “参数化类型 C
,其中 Tᵢ (1 ≤ i ≤ n) 是一个类型”具有各种直接超类型… - ...但是参数化类型 C
,其中至少有一个 Tₙ 是通配符,具有 no 直接超类型 ...- ...因为本节中列出的规则并不完全或部分适用于包含至少一个通配符的参数化类型...
- ...因为通配符不是类型,所以永远不会满足“其中 Tᵢ (1 ≤ i ≤ n) 是类型”的条件。
- ...因为本节中列出的规则并不完全或部分适用于包含至少一个通配符的参数化类型...
这是正确的阅读方式吗?换句话说,我的演绎推理正确吗?
(顺便提一下,有些类型可以“包含”包含通配符的参数化类型(如defined in section 4.5.1)。)
【问题讨论】:
-
进一步阅读!下一条规则讨论“给定泛型类型声明 C
(n > 0),参数化类型 C 的直接超类型至少在哪里其中一个 Ri (1 ≤ i ≤ n) 是通配符类型参数" -
啊,谢谢你;错过了那部分!所以我的阅读是正确的,但正如您正确指出的那样,包含至少一个通配符的参数化类型的超类型是那些将捕获转换应用于原始类型参数的超类型。