List<> List<Integer> 和 List<Number> 的共同父级吗?

2022-09-01 02:07:12

这个 Oracle 教程中

虽然是 的子类型,但不是的子类型,实际上,这两种类型并不相关。IntegerNumberList<Integer>List<Number>

和 的共同父级是 。List<Number>List<Integer>List<?>

我的问题是关于第二句话。我们怎么能说List<>List<Number>List<Integer>的共同父级?

?代表未知类型,可以是任何引用类型。即使我说会在这里,作为 和 的共同父母并不意味着成为 和 的共同父母。?ObjectObjectIntegerNumberList<Object>List<Integer>List<Number>


答案 1

您需要了解的上下文不是列表,而是列表。假设您是创建该类的人,那么您将如何创建该类,以便它仅支持特定类型的类。IntegerNumberList

是的,该类不会使用 Object 作为其类型,而是使用通配符 。List?

正如通配符的文档所说

那么,各种馆藏的超类型是什么呢?它被写成(发音为“未知的集合”)Collection<?>

对于列表也可以说同样的事情。

那么,各种列表的超类型是什么呢?它被写(发音为“未知列表”)List<?>


答案 2

我们可以证明 是 和 的超类型。List<?>List<Number>List<Integer>

来自 JLS 4.10.2(强调我的):

给定泛型类型声明 C<F1,...,Fn> (n > 0),参数化类型的直接超类型 Ti (1 ≤ i ≤ n) 是类型,它们都如下:C<T1,...,Tn>

  • ...

  • C<S1,...,Sn>,其中包含 (1 ≤ i ≤ n) (§4.5.1)SiTi

通过替换为 和 ,我们知道这是 和 的直接超类型,如果包含 和 。CListn=1List<?>List<Number>List<Integer>?NumberInteger

我们可以证明包含 和 因为从 JLS 4.5.1?NumberInteger

通配符等效于无界通配符 。? extends Object?

以及进一步:

如果 表示的类型集可证明是以下规则的自反和传递闭包下所表示的类型集的子集(其中<:表示子类型 (§4.10)),则类型参数称为包含另一个类型参数,写为 <=:T1T2T2T1T2T1

  • ? extends T <= ? extends S如果 T <: S
  • ...
  • T <= ? extends T

我们可以使用上述规则来证明<=,因为<=<=。Number?Number? extends Number? extends Object?


推荐