什么是多级外卡? 语法混乱

我正在阅读AngelikaLangerGenericsFaq的多级外卡。 我对语法很困惑。 该文件说

Collection<Pair>是genericsCollection接口的具体实例。 它是不同类型对的异构集合。 它可以包含PairPairPairPair等类型的元素,依此类推。 换句话说, Collection<Pair>包含不同类型的Pairforms的混合对。

类型Collection<? extends Pair> Collection<? extends Pair>是一个通配符参数化类型; 它不代表具体的参数化类型。 它代表集合系列中的代表,它是Collection接口的实例化,其中type参数的forms为Pair 。 兼容的实例化是Collection<Pair>Collection<Pair>Collection<Pair>Collection<Pair> 。 换句话说,我们不知道它所代表的Collection的实例。

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

我对以下几点感到困惑。

  1. 有人可以用例子详细说明这三个引号。 我完全迷失在语法中
  2. 文件说,para-1是generics类型的具体实例,而其他不是具体的实例化? 那个怎么样?
  3. 自上而下阅读外卡是什么意思?
  4. 多级外卡有什么优势?

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

有人可以用例子详细说明这三个引号。 我完全迷失在语法中

好吧,在这里再次写下这三个引号是没有意义的。 至于,我无法给出更好的解释。 相反,我会尝试回答下面的其他问题,然后你也可能会理解这个问题。 如果没有,您可以再次询问您的查询。 我会稍微再详细说明一下。

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

具体实例化是所有类型参数都是具体类型的实例,并且在编译时是已知的。 例如, List是一个具体的实例,因为String是具体类型。 它的类型在编译时是已知的。 鉴于, List List不是具体类型,因为? extends Number ? extends Number可以是任何扩展Number类型。 所以,它的类型在编译时是未知的。 类似地, Map是generics类型Map的具体实例。

如果是多级类型参数, List> List> ,外部ListList的具体实例,因为在编译时已知元素的类型是List ,尽管内部List是通配符实例化,因为存储的元素类型可以是IntegerDoubleNumber任何子类。 但该段只涉及外部类型。 外部类型只能包含List类型。

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

自上而下阅读外卡是什么意思?

用外行的话说,这意味着从左到右。 在确定参数化类型的类型时,首先会看到最外面的类型参数。 然后,如果该类型参数本身是参数化类型,则转到该参数化类型的类型参数。 因此,我们从左到右阅读类型参数。

多级外卡有什么优势?

假设您要创建水果列表列表 。 现在你的内部List可以包含任何种类的水果。 苹果也是水果香蕉也是水果 。 所以,你必须确保你得到所有这些。 现在,由于generics类型是不变的,在某种意义上, ListList ,如果您的列表类型是List> ,则无法添加List 。 为此你需要使用这样的wildcardsList> List> ,现在可以使用ListList ,任何水果列表。

具有通配符的通用类型实际上是“存在”类型。 如果您对逻辑很熟悉,可以阅读G< ? extends T > G< ? extends T >因为∃S S extends T:G< S >

安吉拉关于阅读类型“自上而下”的解释真的意味着虚构的存在量词隐含在一个包含一个?的类型中? 在它总是尽可能接近? 。 例如,你应该在心理上重写G< H< ? extends T > > G< H< ? extends T > >G< ∃S S extends T:H< S > > 。 由于外部没有量词,因此称为具体。