【问题标题】:Java JLS, the supertype set of a typeJava JLS,一个类型的超类型集
【发布时间】:2017-08-06 19:38:31
【问题描述】:

JLS 的 section 描述了 ST(U) 是什么,其中 U 是一个类型:

令 ST(Ui) 为 Ui 的超类型集。

下面几行,在同一部分,有一个例子:

例如,给定 List 和 List,简单地相交集合 ST(List) = { List, Collection, Object } 和 ST(List) = { List, Collection, Object } 会产生一个集合 { Object },我们会忘记上限可以安全地假定为 List 的事实。

ST(List) 不应该也包括 Iterable 吗?

【问题讨论】:

  • 是的,这看起来像是 JLS 部分的错误。
  • 想一想,List 及其所有超类型也应该在ST(List<String>) 中,因为section 4.10.2ListList<String> 的直接超类型。这个例子真的不行。
  • List 不在 ST(List) 中,因为...它在 EST(List) 中,EST 是已擦除的超类型集。
  • 不,它在 EST 中的事实并不排除它在 ST 中。
  • 请注意,参数化类型的超类型集通常是无限的。例如,List<String> 具有超类型 List<? extends Comparable<String>>,而超类型又具有超类型 List<? extends Comparable<? extends Comparable<String>>>,依此类推。 (我在some utility function for supertype computations 中偶然发现了这一点)。 JLS 中的示例可能仅用于说明目的。

标签: java type-inference jls


【解决方案1】:

你说得对,ST(List<String>) 应该包含Iterable<String>。此外,ST(List<String>) 应该包含ListList 的所有超类型,因为JLS 8 Section 4.10.2

给定一个泛型类型声明 C<F1,...,Fn> (n > 0),参数化类型 C<T1,...,Tn> 的直接超类型,其中 Ti (1 ≤ i ≤ n) 是一个类型,如下:

  • ...
  • 原始类型 C.

所以这个例子实际上并没有演示它试图演示的内容,因为List 实际上在 EST 出现之前位于 ST(List<String>)ST(List<Object>) 的交集处。

我认为该示例可能是为早期版本的超类型规则编写的,然后在规则更改时没有更新。 Java 7 JLS defines the supertype relationship differently,但即便如此,我认为 Iterable<String> 将是 List<String> 的超类型。

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多