JLS8。通用类声明定义

时间:2019-07-20 09:35:32

标签: java generics jls

对不起,如果我的问题不是新问题,但我找不到。

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

给出一个通用类声明C<F1,...,Fn>(n> 0),它的直接超接口 所有类型都是参数化的类类型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>。但是我不确定。有人可以用更多详细信息和示例对此进行解释。 预先感谢。

1 个答案:

答案 0 :(得分:2)

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

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

该规范指定您是否可以在5.2节中为变量分配值。其中表示允许在5.1.5节中进一步指定的扩展参考转换。我们看到,如果ST的子类型,则允许从ST的扩大转换。

4.10节中,我们可以看到很多关于什么算作子类型的规则。最终,您会发现一堆规则,这些规则一起应用,就意味着TS的直接超接口,然后ST的子类型。