關(guān)于java泛型中的extends叮雳,super,我們常常見(jiàn)到妇汗,但是不是常常蒙B帘不,一會(huì)寫(xiě)報(bào)錯(cuò)一會(huì)讀報(bào)錯(cuò)。其到底怎么回事杨箭,這里作一個(gè)淺析寞焙,當(dāng)做自己的筆記。
上代碼
public class Food{};
public class Fruitextends Food{}
public class Appleextends Fruit {}
public class Orangeextends Fruit {}
public void test(){
? ? ?List extendsList =new ArrayList<>();
? ? ?List? superList =new ArrayList<>();
? ? ?extendsList.add(new Fruit());
? ? ?Fruit f = extendsList.get(0);
? ? ?superList.add(new Orange());
? ? ?superList.add(new Apple());
? ? ?superList.add(new Fruit());
? ? ?superList.add(new Food());//只能添加Fruit或其子類(lèi)
? ? ?Fruit furit = superList.get(0);
? ? Object obj = superList.get(0);
}
代碼非常簡(jiǎn)單互婿,下面說(shuō)重點(diǎn)
1.? extends Fruit 的重點(diǎn)是捣郊?, extends Fruit 是用來(lái)限定慈参?的范圍的呛牲。限定?為Fruits或其子類(lèi)驮配。
因?yàn)槟锢渴荈ruits或其子類(lèi),當(dāng)你讀取時(shí)壮锻,可以使用Fruits來(lái)接收琐旁。當(dāng)你寫(xiě)入時(shí),由于不確定猜绣?到底是哪個(gè)具體類(lèi)型灰殴,不能寫(xiě)入。
2.掰邢?super Fruit 的重點(diǎn)是牺陶?伟阔, super Fruit 是用來(lái)限定?的范圍的掰伸。限定皱炉?為Fruits或其超類(lèi)。
因?yàn)榧罟ぃ繛镕ruits的超類(lèi)娃承,當(dāng)你讀取時(shí)只能使用Object來(lái)接收奏夫。當(dāng)你寫(xiě)入時(shí)怕篷,已經(jīng)確定?為Fruits的超類(lèi)酗昼,自然可以寫(xiě)入Fruits或其子類(lèi)廊谓。
Object無(wú)法使用子類(lèi)中的方法,也就基本上沒(méi)用麻削。
這就是PECS原則蒸痹,是不是不好記,個(gè)人給它改了個(gè)名子呛哟,egsa(extends get super add),如果你還是記不住就記eg 好了叠荠, super是反過(guò)來(lái)的,如果你還是記不住扫责,你就記章子怡榛鼎,因?yàn)樗葸^(guò)“藝妓回憶錄”,藝妓===eg鳖孤。
如果還記不住者娱,那您受累,換個(gè)地方吧苏揣。黄鳍。。