日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
5分鐘Java短文:泛型之逆變和協(xié)變

本文轉(zhuǎn)載自微信公眾號(hào)「咸魚正翻身」,作者M(jìn)Dove  。轉(zhuǎn)載本文請(qǐng)聯(lián)系咸魚正翻身公眾號(hào)。 

東坡網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

前言

日?,嵥榈臅r(shí)間下,不適合看一些長篇高質(zhì)量的文章,但是瑣碎時(shí)間也是時(shí)間,看一些短小精悍的文章來查缺補(bǔ)漏也是極好的。碎花化的時(shí)間,就交給“碎片化的文章”來填充吧。

今天“碎片化文章”主題:泛型-逆變和協(xié)變。逆變和協(xié)變擺在這我猜很多朋友會(huì)蒙蔽,畢竟我們?nèi)粘:孟?、大概沒怎么接觸過這個(gè)概念。

事實(shí)并非如此,我們?nèi)粘i_發(fā)中經(jīng)常見,只是不知道這么個(gè)名詞而已。

正文

OK,今天5分鐘短文就讓咱們聊一聊逆變和協(xié)變這倆個(gè)概念。

1、基礎(chǔ)概念

其實(shí)它們倆的概念很好理解。接下來讓我們仔細(xì)讀一遍下邊的這一段話:

逆變與協(xié)變用來描述類型轉(zhuǎn)換后的繼承關(guān)系。如果A、B表示類型,f(...)表示類型轉(zhuǎn)換,≤表示繼承關(guān)系(比如,A≤B表示A是B的子類)

如果f(...)是逆變的,那么當(dāng)A≤B時(shí)則f(B)≤f(A)成立

如果f(...)是協(xié)變的,那么當(dāng)A≤B時(shí)則f(A)≤f(B)成立

額外補(bǔ)充一條:如果f(...)是不變的,那么當(dāng)A≤B時(shí)則f(B)與f(A)沒有任何關(guān)系

2、代碼場(chǎng)景

如果大家充分理解了上邊的話,其實(shí)就能想到咱們?nèi)粘4a中的例子:數(shù)組就是一種協(xié)變;泛型是不變的。上代碼:

 
 
 
 
  1. public class A extends B {} 
  2.  
  3. public class B {} 
  4.  
  5.  
  6.  
  7.  
  8. public void test() { 
  9.  
  10. B[] arrs = new A[66]; 
  11.  
  12. List list = new ArrayList(); 
  13.  

這段代碼是編不過的:

 

因?yàn)閿?shù)組是協(xié)變的,所以 A[]是 B[]的子類;而泛型不是,所以 List并不是 List的子類。

3、通配符的意義

因?yàn)檫@個(gè)原因的存在,所以才有了通配符。

3.1、協(xié)變-上限通配符

代碼改成這個(gè)樣子就可以正常編譯了:

 

通配符的存在,讓泛型產(chǎn)生了協(xié)變,讓 List可以變成 List的子類。不過我猜經(jīng)驗(yàn)豐富的同學(xué)已經(jīng)知道,這樣搞“沒什么卵用”,因?yàn)椋?/b>

 

我們發(fā)現(xiàn),這樣搞完。對(duì)于 list變量來說,我們只能 get()不能 add()!一時(shí)接受不了?其實(shí)這里也很好理解,協(xié)變之后對(duì)于list來說,我可以指向很多 List的子類。

假設(shè)此時(shí)我們可以隨意 add(),那么對(duì)于運(yùn)行期來說簡(jiǎn)直是災(zāi)難:因?yàn)槲铱梢噪S意的 add(newA());add(newC())。如果這種情況存在那么我 get()的時(shí)候,是不是只能把它當(dāng)做 B來使用,因?yàn)檫@里有可能有 A也有可能有 C...

這樣搞完全沒有意義...因此也就有了下邊的內(nèi)容:逆變-下限通配符

3.2、逆變-下限通配符

直接上代碼:

 
 
 
 
  1. public class A extends B {} 
  2.  
  3. public class B {} 
  4.  
  5. public class C extends B {} 
  6.  
  7. public class D extends A {} 
  8.  
  9.  
  10.  
  11.  
  12. public void test2(List list){ 
  13.  
  14. list.add(new A()); 
  15.  
  16. list.add(new B()); 
  17.  
  18. list.add(new C()); 
  19.  
  20. list.add(new D()); 
  21.  

此時(shí)我們會(huì)發(fā)現(xiàn):我們可以 add(), A及其子類。而這種實(shí)現(xiàn)就脫胎于咱們逆變這個(gè)概念。

 

3.3、小思考

如果我們仔細(xì)想一想會(huì)發(fā)現(xiàn),這些都是在開發(fā)階段或者編譯階段的限制。做了這么多限制,到底為了什么?或者收益是什么樣的呢?

關(guān)于這部分內(nèi)容的討論,咱們后續(xù)再聊~

尾聲

到此想聊的內(nèi)容就結(jié)束了,關(guān)于泛型的話題還有很多很多,而熟練的使用和理解泛型對(duì)咱們編寫工具、框架有著關(guān)鍵的幫助。


文章名稱:5分鐘Java短文:泛型之逆變和協(xié)變
URL鏈接:
http://m.5511xx.com/article/copccpe.html