若是你不懂,能夠不看的問題背景:
Java編譯器會阻止對聲明類型爲List<? extend T>
的集合的add操做;會阻止對聲明類型爲List<? super T>
的集合的get操做。
會有相似add(capture<? extend T>) can not be applied to T
的錯誤提示
爲何編譯器要這麼作?安全
咦,你穿越到了CS的世界,你知道這個世界上有一個只能存放一種身份的人或者擁有共同身份的人的黑盒,有一個入口和出口,黑盒上貼了一張紙條,向外面的你提示了黑盒中的人的類型,固然聽說黑盒中會有驚喜。app
你還知道這個世界有下面幾種身份的人:平民、警察、匪徒,警察和匪徒是擁有武器的平民,他們的身份高低相等但都大於平民,可是穿越到這個世界這麼久,你尚未見過一個平民。
並且城裏面還流傳着一個可怕的都市傳說:因爲警察和匪徒手持不一樣的武器,當你把警察和匪徒放到黑盒的同一個空間中,他們就會Boom!甚至因爲從小接受不一樣的教育,若是警察或者匪徒穿上對立身份的衣服見到陽光,他們也會馬上Boom!
天啊,太可怕了!這些瘋子!你無奈的搖搖頭。spa
有一天,別人給你一個黑盒,上面貼着一張紙條「裏面的人的身份大於等於平民」。送禮的人傳給你一句話:「盒子裏面的人實在是太酷了,擁有頂級裝備,並且每個進入這個黑盒的人都會變得很酷」。做爲一個無可救藥的小人愛好蝦者,你很糾結。裏面可能有五種狀況:只有警察、只有匪徒、有警察心的平民、有匪徒心的平民、或者兩種平民混合。對於前兩種狀況,你只能塞對應的警察或者匪徒進去;對於後三種狀況,你能夠安心的聽任意警察或者匪徒進去。看着一櫃子的普通人偶,你有點心動,但問題是:在真正放進一個警察或者匪徒進去前,你永遠不知道這個黑盒會不會Boom!爲了防止發生薛定諤的悲劇,你發誓永遠不往這個黑盒中塞東西。可是你抑制不住心中的好奇,但願把黑盒中的人都拿出來看看,爲了避免Boom,你只能用平民的方式把黑盒裏的人拿出來,你安慰本身,至少能看看平民長什麼樣子吧。好吧,這是你在這個世界見到的第一個平民。code
又過了一天,別人又給你一個黑盒,上面又貼着一張紙條「裏面的人的身份小於等於平民」。送禮的人傳給你一句話:「盒子裏面有一我的身上或者裝備上有財寶」。你很糾結,裏面可能有三種狀況:有警察心的平民、有匪徒心的平民、或者二者都有,根據上一次的坑爹經驗,你已經知道平民倍受歧視,上面啥都沒有;問題是你不知道里面具體的是警察仍是匪徒,警察不可能變成匪徒拿出來,匪徒也不可能變成警察拿出來,不然就會Boom!是搏一搏?你知道你很慫,因此你艱難的把黑盒的出口用膠水封存了。想到這個黑盒把本身的心情搞得一團糟,你氣憤的把上次取出來的平民人偶所有塞進黑盒,扔出窗外。ip
PS:編譯器是很是怕死的,對於給出<? extend T>
、<? super T>
這種類型聲明的集合,它基於「向上轉型」的原則,用最安全的方式去處理。get