ben*_*enz 5 java generics wildcard
我正在阅读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接口的实例化,其中type参数是表单的形式Pair<String,?>.兼容的实例是Collection<Pair<String,Long>>,Collection<Pair<String,String>>,Collection<Pair<String,Object>>,或Collection<Pair<String,?>>.换句话说,我们不知道它所代表的Collection的实例.根据经验,您必须从上到下阅读多级通配符.
我对以下几点感到困惑.
有人可以详细说明这些要点.谢谢.
Roh*_*ain 11
有人可以用例子详细说明这三个引号.我完全迷失在语法中
那么,在这里再次写下这三个引号是没有意义的.至于,我无法给出更好的解释.相反,我会尝试回答下面的其他问题,然后你也可能会理解这个问题.如果没有,您可以再次询问您的查询.我会稍微再详细说明一下.
文件说,para-1是泛型类型的具体实例,而其他不是具体的实例化?那个怎么样?
具体实例化是所有类型参数都是具体类型的实例,并且在编译时是已知的.例如,List<String>是一个具体的实例,因为它String是一个具体的类型.它的类型在编译时是已知的.然而,List<? extends Number>它不是具体类型,因为? extends Number任何类型都可以延伸Number.所以,它的类型在编译时是未知的.同样,Map<String, Integer>是泛型类型的具体实例Map<K, V>.
在多级类型参数的情况下,List<List<? extends Number>>中,外部List是的具体实例List<E>,因为元素的类型被称为是一个List在编译时,虽然内List是一个通配符的实例化,为存储可以是元素的类型Integer,Double,任何子类Number.但该段只涉及外部类型.外部类型只能包含List类型.
这就是为什么第一段说的,它是一个异类的集合Pair,因为实际的类型参数Pair可以是任何东西,但这肯定是Pair没有别的.
自上而下阅读外卡是什么意思?
用外行的话说,这意味着从左到右.在确定参数化类型的类型时,首先会看到最外面的类型参数.然后,如果该类型参数本身是参数化类型,则转到该参数化类型的类型参数.因此,我们从左到右阅读类型参数.
多级外卡有什么优势?
假设您要创建水果列表列表.现在你的内心List可以包含任何种类的水果.一个苹果也是水果和香蕉也是水果.所以,你必须确保你得到所有这些.现在,由于泛型类型是不变的,从某种意义上讲,它List<Apple>是不一样的List<Fruit>,List<Apple>如果您的列表类型是,则无法添加List<List<Fruit>>.对于您将需要使用wildcards这样的- List<List<? extends Fruit>>,现在可以采取List<Apple>,List<Banana>任何水果的清单.
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |