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 部分中的变量赋值,是允许的。我们看到如果 S
是 T
.
的子类型,则允许从 S
到 T
的扩大转换
并且从4.10部分,我们可以看到很多关于什么算作子类型的规则。最终你会发现一堆规则,当它们一起应用时,意味着 T
是 S
的直接超接口,然后 S
是 T
的子类型。
抱歉,如果我的问题不是新问题但我找不到它。
现在我正在阅读 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 部分中的变量赋值,是允许的。我们看到如果 S
是 T
.
S
到 T
的扩大转换
并且从4.10部分,我们可以看到很多关于什么算作子类型的规则。最终你会发现一堆规则,当它们一起应用时,意味着 T
是 S
的直接超接口,然后 S
是 T
的子类型。