<? extends T>:存儲(chǔ)的是T或者T的子類(lèi)
那么根就是T了(上限),由于存儲(chǔ)的是T/T子類(lèi)蓖乘,所以具體的類(lèi)型是不確定的(因?yàn)椴恢来鎯?chǔ)的是哪一種具體子類(lèi)),但是里面的類(lèi)型肯定是屬于T基類(lèi)類(lèi)型的(因?yàn)榇鎯?chǔ)的不管是什么子類(lèi)類(lèi)型,都是可以強(qiáng)轉(zhuǎn)為基類(lèi)的)觉啊。從以上分析可以得知,<? extends T>無(wú)法往里面存儲(chǔ)數(shù)據(jù)(不知道要存儲(chǔ)哪種子類(lèi)類(lèi)型)沈贝,但是可以往里面獲取數(shù)據(jù)(都是T基類(lèi)類(lèi)型)杠人。
<? super T>:存儲(chǔ)的是T或者T的基類(lèi)
那么根就是T了(下限),由于存儲(chǔ)的都是T/T基類(lèi),因此嗡善,可以往里面存任意T的子類(lèi)型(但是不能存儲(chǔ)T的基類(lèi)型辑莫,因?yàn)門(mén)基類(lèi)有很多種,不能確定是存儲(chǔ)哪一種罩引,這種情況跟<? extends T>不能進(jìn)行add的操作原因是一樣的各吨,只是super無(wú)法確定存儲(chǔ)哪種基類(lèi),extends無(wú)法確定存儲(chǔ)的是哪種子類(lèi))袁铐,獲取元素時(shí)揭蜒,由于存儲(chǔ)的是T/T基類(lèi),無(wú)法確定獲取的是哪種具體基類(lèi)類(lèi)型剔桨,所以是無(wú)法進(jìn)行數(shù)據(jù)獲取的(其實(shí)獲取是可以的屉更,但是獲取 到的都是Object類(lèi)型)。
舉例
比如現(xiàn)有一個(gè)籃子(集合)领炫,籃子里面可以盛放各種水果:
class Fruit{}
class Apple extends Fruit{}
class Orange extends Fruit{}
class Banana extends Fruit{}
class RedOrange extends Orange{}
class GoldenOrange extends Orange{}
那么:
<? extends Orange >
存放的可能是RedOrange
偶垮,GoldenOrange
等等中的特定一種,所以在沒(méi)掀開(kāi)籃子遮布前帝洪,我無(wú)法確定籃子放的是具體哪種水果似舵,所以無(wú)法進(jìn)行存(add
)操作(因?yàn)椴恢酪婺姆NOrange
)。但是葱峡,就算是閉著眼睛從籃子里拿出一個(gè)東西砚哗,我肯定知道拿出的是Orange
(不管拿出來(lái)的是RedOrange
,GoldenOrange
還是什么砰奕,反正都是Orange
)蛛芥,所以取(get
)操作可行。
<? super Orange>
存放的可能是Orange
军援,Fruit
中的特定一種仅淑,所以在沒(méi)掀開(kāi)籃子遮布前,我無(wú)法確定籃子放的是具體哪種水果胸哥,所以無(wú)法進(jìn)行取(get
)操作(有可能拿出來(lái)的是Orange
涯竟,有可能是Fruit
)。但是空厌,只要是往里面存放Orange
類(lèi)型水果庐船,那么是絕對(duì)是可以的(因?yàn)榛@子里面的是Orange
或者Fruit
中特定水果,那么RedOrange
和GolenOrange
也是屬于Orange
和Fruit
呀)嘲更。
總結(jié)
<? extends T>
可以獲取數(shù)據(jù)(get T類(lèi)型)筐钟,無(wú)法存儲(chǔ)數(shù)據(jù)(add)。
<? superT>
可以存儲(chǔ)數(shù)據(jù)(add T及T的子類(lèi))赋朦,無(wú)法獲取數(shù)據(jù)(get)篓冲。
什么時(shí)候要使用<? extends T>
,<? super T>
呢李破,請(qǐng)記住下面這句話(huà):
- 如果你是希望調(diào)用T方法,那么使用
<? extends T>
纹因,因?yàn)槟憧梢赃M(jìn)行取操作(get
)喷屋。 - 如果你是希望往容器里面存數(shù)據(jù),那么使用
<? super T>
瞭恰。