JLS8。通用 class 声明定义

JLS8. Generic class declaration definition

抱歉,如果我的问题不是新问题但我找不到它。

现在我正在阅读 jls8,但我无法理解其中的一个定义。在 8.1.5 Superinterfaces 一章中,我遇到了这个

给定一个通用的 class 声明 C<F1,...,Fn> (n > 0), 参数化class类型C<T1,...,Tn>,其中Ti(1≤i≤n)是一个类型,都是类型 I<U1 θ,...,Uk θ>,其中 I<U1,...,Uk>C<F1,...,Fn> 的直接超接口,θ 是 替换 [F1:=T1,...,Fn:=Tn].

如果我理解正确,这个定义意味着我可以分配 List<String> = ArrayList<String> 但不是例如List<String> = ArrayList<Integer>。但我不确定。有人可以用更多的细节和例子来解释这一点。 提前致谢。

您引用的声明是关于超级接口的声明,而不是关于您可以分配给什么的声明。

List<String>ArrayList<String> 的上下文中,声明说 List<String>ArrayList<String> 的直接超接口。它没有说明您是否可以将一个分配给另一个。

规范指定您是否可以为 5.2. In it, it says that a widening reference conversion, which is further specified in section 5.1.5 部分中的变量赋值,是允许的。我们看到如果 ST.

的子类型,则允许从 ST 的扩大转换

并且从4.10部分,我们可以看到很多关于什么算作子类型的规则。最终你会发现一堆规则,当它们一起应用时,意味着 TS 的直接超接口,然后 ST 的子类型。