什么是多级外卡? 语法混乱
我正在阅读AngelikaLangerGenericsFaq的多级外卡。 我对语法很困惑。 该文件说
Collection<Pair>
是genericsCollection接口的具体实例。 它是不同类型对的异构集合。 它可以包含Pair
,Pair
,Pair
,Pair
等类型的元素,依此类推。 换句话说,Collection<Pair>
包含不同类型的Pair
forms的混合对。类型
Collection<? extends Pair>
Collection<? extends Pair>
是一个通配符参数化类型; 它不代表具体的参数化类型。 它代表集合系列中的代表,它是Collection接口的实例化,其中type参数的forms为Pair
。 兼容的实例化是Collection<Pair>
,Collection<Pair>
,Collection<Pair>
或Collection<Pair>
。 换句话说,我们不知道它所代表的Collection的实例。根据经验,您必须从上到下阅读多级通配符。
我对以下几点感到困惑。
- 有人可以用例子详细说明这三个引号。 我完全迷失在语法中
- 文件说,para-1是generics类型的具体实例,而其他不是具体的实例化? 那个怎么样?
- 自上而下阅读外卡是什么意思?
- 多级外卡有什么优势?
有人可以详细说明这些要点。 谢谢。
有人可以用例子详细说明这三个引号。 我完全迷失在语法中
好吧,在这里再次写下这三个引号是没有意义的。 至于,我无法给出更好的解释。 相反,我会尝试回答下面的其他问题,然后你也可能会理解这个问题。 如果没有,您可以再次询问您的查询。 我会稍微再详细说明一下。
文件说,para-1是generics类型的具体实例,而其他不是具体的实例化? 那个怎么样?
具体实例化是所有类型参数都是具体类型的实例,并且在编译时是已知的。 例如, List
是一个具体的实例,因为String
是具体类型。 它的类型在编译时是已知的。 鉴于, List extends Number>
List extends Number>
不是具体类型,因为? extends Number
? extends Number
可以是任何扩展Number
类型。 所以,它的类型在编译时是未知的。 类似地, Map
是generics类型Map
的具体实例。
如果是多级类型参数, List
>
List
,外部>
List
是List
的具体实例,因为在编译时已知元素的类型是List
,尽管内部List
是通配符实例化,因为存储的元素类型可以是Integer
, Double
, Number
任何子类。 但该段只涉及外部类型。 外部类型只能包含List
类型。
这就是为什么第一段说的,它是Pair
的异构集合,因为Pair
的实际类型参数可以是任何东西,但这肯定是Pair
而不是别的。
自上而下阅读外卡是什么意思?
用外行的话说,这意味着从左到右。 在确定参数化类型的类型时,首先会看到最外面的类型参数。 然后,如果该类型参数本身是参数化类型,则转到该参数化类型的类型参数。 因此,我们从左到右阅读类型参数。
多级外卡有什么优势?
假设您要创建水果列表列表 。 现在你的内部List
可以包含任何种类的水果。 苹果也是水果 , 香蕉也是水果 。 所以,你必须确保你得到所有这些。 现在,由于generics类型是不变的,在某种意义上, List
与List
,如果您的列表类型是List
,则无法添加>
List
。 为此你需要使用这样的wildcards
– List
>
List
,现在可以使用>
List
, List
,任何水果列表。
具有通配符的通用类型实际上是“存在”类型。 如果您对逻辑很熟悉,可以阅读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 > >
。 由于外部没有量词,因此称为具体。