【问题标题】:JLS8. Generic class declaration definitionJLS8。泛型类声明定义
【发布时间】:2019-07-20 09:35:32
【问题描述】:

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

现在我正在阅读 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>.但我不确定。有人可以用更多细节和例子来解释这一点。 提前致谢。

【问题讨论】:

    标签: java generics jls


    【解决方案1】:

    你引用的陈述是关于超级接口的陈述,而不是关于你可以分配什么的陈述。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 2018-12-14
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多