Producer Extends Consumer Super
如果參數(shù)化類(lèi)型表示一個(gè)生產(chǎn)者,就使用<? extends T>;如果它表示一個(gè)消費(fèi)者,就使用<? super T>
個(gè)人理解
在閱讀阿里巴巴Java開(kāi)發(fā)手冊(cè)
時(shí)看到這個(gè)原則,于是就學(xué)習(xí)了一番.
個(gè)人認(rèn)為這個(gè)原則重點(diǎn)的地方在于理解List<? extends Fruit>
和List<? super Apple>
中的 ? 代表的意思.
在List<? extends Fruit>
的泛型集合中,對(duì)于元素的類(lèi)型,編譯器只能知道元素是繼承自Fruit,具體是Fruit的哪個(gè)子類(lèi),這是無(wú)法知道的,所以向一個(gè)無(wú)法知道具體類(lèi)型的泛型集合中插入元素是不能通過(guò)編譯的.但是,由于知道元素是繼承自Fruit,所以從這個(gè)泛型集合中取Fruit類(lèi)型的元素是可以的.
在List<? super Apple>
的泛型集合中,元素的類(lèi)型是Apple的父類(lèi),但無(wú)法知道是哪個(gè)具體的父類(lèi),因此讀取元素時(shí)無(wú)法確定以哪個(gè)父類(lèi)進(jìn)行讀取.插入元素時(shí),可以插入Apple與Apple的子類(lèi),因?yàn)檫@個(gè)集合中的元素都是Apple的父類(lèi).
總結(jié)
只讀不可寫(xiě)時(shí),使用List<? extends Fruit>
:Producer
只寫(xiě)不可讀時(shí),使用List<? super Apple>
:Consumer
參考
Java泛型中的PECS原則
Java 泛型: 什么是PECS(Producer Extends, Consumer Super)