成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

5分鐘Java短文:泛型之逆變和協變

開發 后端
日常瑣碎的時間下,不適合看一些長篇高質量的文章,但是瑣碎時間也是時間,看一些短小精悍的文章來查缺補漏也是極好的。碎花化的時間,就交給“碎片化的文章”來填充吧。

[[344440]]

本文轉載自微信公眾號「咸魚正翻身」,作者MDove  。轉載本文請聯系咸魚正翻身公眾號。 

前言

日常瑣碎的時間下,不適合看一些長篇高質量的文章,但是瑣碎時間也是時間,看一些短小精悍的文章來查缺補漏也是極好的。碎花化的時間,就交給“碎片化的文章”來填充吧。

今天“碎片化文章”主題:泛型-逆變和協變。逆變和協變擺在這我猜很多朋友會蒙蔽,畢竟我們日常好像、大概沒怎么接觸過這個概念。

事實并非如此,我們日常開發中經常見,只是不知道這么個名詞而已。

正文

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

1、基礎概念

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

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

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

如果f(...)是協變的,那么當A≤B時則f(A)≤f(B)成立

額外補充一條:如果f(...)是不變的,那么當A≤B時則f(B)與f(A)沒有任何關系

2、代碼場景

如果大家充分理解了上邊的話,其實就能想到咱們日常代碼中的例子:數組就是一種協變;泛型是不變的。上代碼:

  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<B> list = new ArrayList<A>(); 
  13.  

這段代碼是編不過的:

 

因為數組是協變的,所以 A[]是 B[]的子類;而泛型不是,所以 List并不是 List的子類。

3、通配符的意義

因為這個原因的存在,所以才有了通配符。

3.1、協變-上限通配符

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

 

通配符的存在,讓泛型產生了協變,讓 List可以變成 List的子類。不過我猜經驗豐富的同學已經知道,這樣搞“沒什么卵用”,因為:

 

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

假設此時我們可以隨意 add(),那么對于運行期來說簡直是災難:因為我可以隨意的 add(newA());add(newC())。如果這種情況存在那么我 get()的時候,是不是只能把它當做 B來使用,因為這里有可能有 A也有可能有 C...

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

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<? super A> 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.  

此時我們會發現:我們可以 add(), A及其子類。而這種實現就脫胎于咱們逆變這個概念。

 

3.3、小思考

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

關于這部分內容的討論,咱們后續再聊~

尾聲

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

 

責任編輯:武曉燕 來源: 咸魚正翻身
相關推薦

2022-04-18 20:12:03

TypeScript靜態類型JavaScrip

2021-07-01 06:47:30

Java泛型泛型擦除

2013-05-03 10:57:09

泛型泛型教程

2024-06-19 09:58:29

2009-08-03 18:24:28

C# 4.0協變和逆變

2009-05-27 11:30:20

C#Visual Stud協變

2012-06-28 10:26:51

Silverlight

2019-12-12 10:25:33

Java泛型編程語言

2020-03-17 07:41:50

ApacheKafka系統

2011-01-14 10:27:18

C#.netasp.net

2012-03-13 09:32:15

C#協變

2020-09-14 11:30:26

HTTP3運維互聯網

2021-04-30 16:23:58

WebRTC實時音頻

2021-01-29 11:43:53

SSHLinux命令

2020-07-25 19:40:33

Java開發代碼

2025-02-17 10:41:16

2020-12-07 11:23:32

Scrapy爬蟲Python

2020-05-15 07:30:08

黑客Thunderbolt漏洞

2021-03-23 15:35:36

Adam優化語言

2020-02-17 13:45:27

抓取代碼工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人网视频| 激情久久网 | 男女精品久久 | 99在线视频观看 | 精品国产一区二区三区观看不卡 | 美国十次成人欧美色导视频 | 国产激情免费视频 | 黄色日批视频 | 亚洲精品一区二区三区在线观看 | 欧美日韩一区二区视频在线观看 | 天天搞天天搞 | 国产激情一区二区三区 | 久久免费高清 | 国产美女一区二区 | 久久99精品久久久久蜜桃tv | 欧美狠狠操 | 国产亚洲精品精品国产亚洲综合 | 伊人免费网| 中文字幕一区在线观看视频 | 999在线精品| 精品在线观看入口 | 国产日韩欧美一区 | 性高湖久久久久久久久3小时 | 色偷偷噜噜噜亚洲男人 | 日韩高清中文字幕 | 成人精品一区亚洲午夜久久久 | 日韩电影一区二区三区 | 在线成人免费视频 | 日本在线综合 | 国产精品久久久久久久久久免费 | 国产精品一区一区 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 97色在线视频 | 久久夜色精品国产 | 欧美精品在线一区二区三区 | 天天拍天天操 | 一区视频在线 | 成人精品国产免费网站 | 中文精品久久 | www.婷婷| 91精品久久久久久久久久入口 |