抱歉,如果我的问题不是新问题,但我找不到它。
现在我正在阅读 jls8,但我无法理解其中的一个定义。在章节8.1.5 Superinterfaces 我遇到了这个
给定一个泛型类声明 C<F1,...,Fn>
(n > 0),直接 super 接口(interface)
参数化类类型C<T1,...,Tn>
,其中 Ti (1 ≤ i ≤ n) 是一种类型,是所有类型
I<U1 θ,...,Uk θ>
,其中I<U1,...,Uk>
是 C<F1,...,Fn>
的直接 super 接口(interface)θ 是
替换 [F1:=T1,...,Fn:=Tn]。
如果我理解正确,这个定义意味着我可以分配 List<String> = ArrayList<String>
但不是例如List<String> = ArrayList<Integer>
.但我不确定。有人可以用更多细节和示例来解释这一点吗?
提前致谢。
最佳答案
您引用的声明是关于 super 接口(interface)的声明,而不是关于您可以将什么分配给什么的声明。
在List<String>
的背景下,和ArrayList<String>
,声明说 List<String>
是 ArrayList<String>
的直接 super 接口(interface)。它没有说明您是否可以将一个分配给另一个。
该规范指定是否可以为 5.2 节中的变量赋值。其中,它表示扩大引用转换,这在 5.1.5 节中进一步指定。 , 被允许。我们看到从 S
开始允许扩大转换。至T
如果S
是 T
的子类型.
来自4.10部分,我们可以看到很多关于子类型的规则。最终你会发现一堆规则,当它们一起应用时,意味着 T
是 S
的直接 super 接口(interface),然后S
是 T
的子类型.
关于java - JLS8。通用类声明定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123455/