最近在看阿里開(kāi)發(fā)手冊(cè)時(shí)看到<岳守? extends T >和<? super T>床绪,以及PECS原則。
記錄一下我的理解迅细。
簡(jiǎn)單理解就是
- ? extends T與?super T兩者用于泛型對(duì)象的讀取和插入操作:
- ? extends T子類限定淘邻,被其修飾的對(duì)象只能進(jìn)行讀取操作茵典,不能增刪。
- ? super T超類限定宾舅,被其修飾的對(duì)象只能進(jìn)行增刪操作统阿,不能讀取。
測(cè)試類
class human{}
class man extends human{
private String name;
man(){}
man(String name){this.name = name;}
public String getName(){return name};
}
class xiaoming extends man{
private String name;
xiaoming(String name){
this.name = name;
}
public String getName(String name){
return name;
}
}
測(cè)試調(diào)用方法
public void test(){
//超類限定對(duì)象 可以添加本身和自己的子類
List<? super man> list = new ArrayList<man>();
list.add(new man("man1"));
list.add(new xiaoming("qwe"));
List<man> manList = new ArrayList<>();
manList.add(new man("asd"));
manList.add(new man("qwe"));
testExtends(manList);
testSuper(manList);
}
子類限定
對(duì)于傳入的泛型對(duì)象只能查看筹我,不能刪改扶平。被? extends T修飾的泛型對(duì)象,不能添加其本身蔬蕊,子類或者父類以及其他任一一種對(duì)象结澄。
public void testExtends(List<? extends man> list) {
for(man m : list) {
System.out.println(m.getName());
}
System.out.println(list.get(0).getName());
System.out.println(list.isEmpty());
}
超類限定
對(duì)傳入的參數(shù)可以進(jìn)行修改,但是不能查看岸夯。例如下面的getName()方法就會(huì)爆紅麻献,因?yàn)閭鱽?lái)的List<? super man> man List是Object類型,且有? super man T限定囱修,即使加了強(qiáng)制轉(zhuǎn)換(man)也無(wú)法識(shí)別赎瑰。
public void testSuper(List<? super man> list){
System.out.println("-----進(jìn)入super-----");
list.add(new man("qwee"));
list.remove(0);
System.out.println((man)list.get(0));
//上面這條語(yǔ)句如果加上.getName()就會(huì)報(bào)紅
//因?yàn)?man)list.get(0)不能被當(dāng)成man類型的對(duì)象
}
運(yùn)行結(jié)果 com.example.postest.post是我的包名
將? extends T 和 破镰? super T運(yùn)用到實(shí)際中餐曼。? extends T 修飾的對(duì)象只負(fù)責(zé)讀取鲜漩,源譬? super T修飾的對(duì)象只負(fù)責(zé)插入。就是PECS(Producer Extends, Consumer Super)原則孕似。
接著是官方的標(biāo)準(zhǔn)用法踩娘,java.util.collection中的copy方法
copy方法