【问题标题】:Should a parameterized type's direct supertype set contain it?参数化类型的直接超类型集是否应该包含它?
【发布时间】:2021-11-29 19:27:32
【问题描述】:

the Java Language Specification, version 11, section 4.10.2 中,部分内容是在讨论类和接口类型的直接超类型时:

给定具有类型参数 F1,...,Fn (n > 0) 的泛型类或接口 C,参数化类型 C 的直接超类型,其中每个 Ti (1 ≤ i ≤ n) 是一个类型,都是以下几种:

[…]

C 其中 Si 包含 Ti (1 ≤ i ≤ n) (§4.5.1)。

“包含”是指:

如果 T2 表示的类型集在自反和传递闭包下可证明是 T1 表示的类型集的子集,则称一个类型参数 T1 包含另一个类型参数 T2,写作 T2

[…]

T

注意,T

按照规则,如果我有一个参数化类型 C,那么它的直接超类型之一将是一个参数化类型 C,其中 S1 包含 T1(其中 T1 包含在 S1 中)。包含类的 T1 之一是 T1 本身(T 等于 C,并且由于根据这些规则 C 是 C,那么 C 就是它自己的直接超类型。

这是故意的吗?我问这个问题是因为我对规范的阅读是没有其他规则描述直接超类型关系允许一个类型成为它自己的直接超类型,所以这个让我停下来。

【问题讨论】:

  • 感谢您的宝贵时间和评论!是的,我知道正确的超类型,但在直接超类型部分的任何地方都没有提到它,因为它是基于它的。
  • 但是参数化类型是它自己的direct超类型,在所有Java类型中是独一无二的。

标签: java jls


【解决方案1】:

没错。 Java 语言规范中没有任何内容对区别特别感兴趣。 java-the-language(或就此而言,java-the-VM,如 JVMS 中指定的那样)中没有可以接受适当超类型(如实际不同)但类型本身不可接受的结构。

X foo = exprOfTypeY;

这里 X 必须是 Y 的超类型才能使其有效。当然,如果 X 和 Y 相同,上面的代码是有效的。

这同样适用于任何地方。即使在绑定类型变量或<? super Foo> 类型的通配符时也是如此。 Foo 本身在那里有效,并且被认为是满足<? super Foo> 要求的合适类型。

正如 user16320675 指出的那样,规范中的某些地方仅在某些地方进行区分是有用的。在它出现的地方,使用术语proper supertype

JLS §4.10:

S 是 T 的适当超类型,写作 S > T,如果 S :> T 且 S ≠ T。

最后一点表明S :> T 在 S 和 T 相同时成立,因此需要明确指出它们也不相同,以便符合“正确超类型”的定义。

有点奇怪,第 4 章的所有内容(我快速浏览了一下,所以我可能错过了)似乎明确说明任何类型都是它自己的超类型/任何类型都“包含”自己。 '好吧,如果他们没有,我在第 4.10 节中引用的那一点的措辞是多余的'是唯一的方法。也许是 JLS 规范中的疏忽。这是众所周知的。我会从常识上说 java 语言从不关心正确的超类型,只关心实际的超类型(即,如果需要超类型,类型本身总是一样好),以及第 4.10 节中的S ≠ T Rider ,这显然是有意的。

【讨论】:

  • 感谢您的宝贵时间和评论!是的,我知道适当的超类型。然而,它们基于直接超类型的概念,因此直接超类型更为原始。有趣的是,我想我找到了答案,如果您有任何进一步的见解,我将在后续评论中添加。
  • 我认为答案可能是:对于所有其他类型,都有子类型的概念。对于参数化类型,明确排除了子绑定。那么如何any 将一个参数化类型分配给另一个工作呢?我猜,答案一定是,只有在这种情况下(参数化类型),C 的超类型才是 C
  • 我还有一个问题与您上面的想法相呼应:stackoverflow.com/questions/69488014/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多