6

我正在阅读AngelikaLangerGenericsFaq的多级通配符。我对语法很困惑。文件说

该类型Collection<Pair<String,?>>是泛型 Collection 接口的具体实例。它是不同类型对的异构集合。它可以包含 Pair<String,Long>, Pair<String,Date>, Pair<String,Object>, Pair<String,String>, 等类型的元素。换句话说, Collection<Pair<String,?>>包含对不同类型的表单的混合Pair<String,?>

该类型 Collection<? extends Pair<String,?>>是通配符参数化类型;它不代表具体的参数化类型。它代表集合家族中的一个代表,它们是 Collection 接口的实例化,其中类型参数的形式为Pair<String,?>。兼容的实例是Collection<Pair<String,Long>>Collection<Pair<String,String>>Collection<Pair<String,Object>>Collection<Pair<String,?>>。换句话说,我们不知道它代表 Collection 的哪个实例化。

根据经验,您必须自上而下阅读多级通配符。

我对以下几点感到困惑。

  1. 有人可以举例说明这三个引用吗?我完全迷失在语法中
  2. 文件说, para-1 是泛型类型的具体实例化,而 other 不是具体实例化?那个怎么样?
  3. 自上而下阅读通配符是什么意思?
  4. 多级通配符有什么好处?

有人可以详细说明这些观点。谢谢。

4

2 回答 2

11

有人可以举例说明这三个引用吗?我完全迷失在语法中

好吧,在这里再次写这 3 个引号是没有意义的,因为我无法给出比这更好的解释。相反,我将尝试在下面回答您的其他问题,那么您可能也会理解这个问题的答案。如果没有,您可以再次询问您的问题,我将尝试进一步详细说明。

文件说, para-1 是泛型类型的具体实例化,而 other 不是具体实例化?那个怎么样?

具体实例化是所有类型参数都是具体类型并且在编译时已知的实例化。例如,List<String>是一个具体的实例化,因为String是一个具体的类型。它的类型在编译时是已知的。然而,List<? extends Number>不是一个具体的类型,因为? extends Number可以是任何扩展的类型Number。因此,它的类型在编译时是未知的。同样,Map<String, Integer>是泛型类型的具体实例化Map<K, V>

在多级类型参数的情况下,List<List<? extends Number>>外部List是 的具体实例化,因为元素的类型在编译时List<E>是已知的,尽管内部是通配符实例化,因为存储的元素类型可以是,, 的任何子类。但是那段只是在谈论外部类型。并且外部类型只能包含类型。ListListIntegerDoubleNumberList

这就是为什么第一段说,它是 的异构集合Pair,因为 的实际类型参数Pair可以是任何东西,但那肯定是Pair,仅此而已。

自上而下阅读通配符是什么意思?

通俗地说,就是从左到右。在确定参数化类型的类型时,您首先会看到最外层的类型参数。然后,如果该类型参数本身是参数化类型,那么您将转到该参数化类型的类型参数。因此,我们从左到右读取类型参数。

多级通配符有什么好处?

假设您要创建一个List of Fruits。现在你的内心List可以包含任何种类的水果。苹果也是水果香蕉也是水果。_ 所以,你必须确保你得到所有这些。现在,由于泛型类型是不变的,从某种意义上说,List<Apple>与 不同,如果您的列表类型是List<Fruit>,则不能添加 a 。为此,您需要像这样使用 - ,它现在可以使用, , 任何水果的列表。List<Apple>List<List<Fruit>>wildcardsList<List<? extends Fruit>>List<Apple>List<Banana>

于 2013-08-12T19:32:26.103 回答
-1

带有通配符的泛型类型是真正的“存在”类型。如果您完全熟悉逻辑,则可以阅读G< ? extends T >为 ∃ S extends T:G< S >

Angela 关于“自上而下”阅读类型的解释实际上意味着包含 a 的类型所隐含的虚构存在量词?总是尽可能接近?. 例如,您应该在心里重写G< H< ? extends T > >G<S extends T:H< S > >。由于外面没有量词,所以叫具体。

于 2013-08-22T09:31:11.657 回答