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

Java 泛型中super T和extends T的區別

開發 后端
經常發現有List< super T>、Set<extends T>的聲明,是什么意思呢?< super T>表示包括T在內的任何T的父類,< extends T>表示包括T在內的任何T的子類,下面我們詳細分析一下兩種通配符具體的區別。

經常發現有List< super T>、Set<extends T>的聲明,是什么意思呢?< super T>表示包括T在內的任何T的父類,< extends T>表示包括T在內的任何T的子類,下面我們詳細分析一下兩種通配符具體的區別。

extends

  1. List< extends Number> foo3的通配符聲明,意味著以下的賦值是合法的: 
  2.  
  3. // Number "extends" Number (in this context) 
  4.  
  5. List< extends Number> foo3 = new ArrayList< extends Number>(); 
  6.  
  7. // Integer extends Number 
  8.  
  9. List< extends Number> foo3 = new ArrayList< extends Integer>(); 
  10.  
  11. // Double extends Number 
  12.  
  13. List< extends Number> foo3 = new ArrayList< extends Double>(); 
  • 讀取操作通過以上給定的賦值語句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你可以讀取到Number,因為以上的列表要么包含 Number元素,要么包含Number的類元素。你不能保證讀取到Integer,因為foo3可能指向的是List<Double>。你 不能保證讀取到Double,因為foo3可能指向的是List<Integer>。

  • 寫入操作過以上給定的賦值語句,你能把一個什么類型的元素合法地插入到foo3中呢?你不能插入一個Integer元素,因為foo3可能指向 List<Double>。你不能插入一個Double元素,因為foo3可能指向List<Integer>。你不能插入一個 Number元素,因為foo3可能指向List<Integer>。你不能往List< extends T>中插入任何類型的對象,因為你不能保證列表實際指向的類型是什么,你并不能保證列表中實際存儲什么類型的對象。***可以保證的是,你可以從中讀 取到T或者T的子類。

super

現在考慮一下List< super T>。

 

  1. List< super Integer> foo3的通配符聲明,意味著以下賦值是合法的: 
  2.  
  3. // Integer is a "superclass" of Integer (in this context) 
  4.  
  5. List< super Integer> foo3 = new ArrayList<Integer>(); 
  6.  
  7. // Number is a superclass of Integer 
  8.  
  9. List< super Integer> foo3 = new ArrayList<Number>(); 
  10.  
  11. // Object is a superclass of Integer 
  12.  
  13. List< super Integer> foo3 = new ArrayList<Object>(); 
  • 讀取操作通過以上給定的賦值語句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你不能保證讀取到Integer,因為foo3可能指向 List<Number>或者List<Object>。你不能保證讀取到Number,因為foo3可能指向 List<Object>。***可以保證的是,你可以讀取到Object或者Object子類的對象(你并不知道具體的子類是什么)。

  • 寫入操作通過以上給定的賦值語句,你能把一個什么類型的元素合法地插入到foo3中呢?你可以插入Integer對象,因為上述聲明的列表都支持 Integer。你可以插入Integer的子類的對象,因為Integer的子類同時也是Integer,原因同上。你不能插入Double對象,因為 foo3可能指向ArrayList<Integer>。你不能插入Number對象,因為foo3可能指向 ArrayList<Integer>。你不能插入Object對象,因為foo3可能指向 ArrayList<Integer>。

PECS

請記住PECS原則:生產者(Producer)使用extends,消費者(Consumer)使用super。

生產者使用extends

如果你需要一個列表提供T類型的元素(即你想從列表中讀取T類型的元素),你需要把這個列表聲明成< extends T>,比如List< extends Integer>,因此你不能往該列表中添加任何元素。

消費者使用super

如果需要一個列表使用T類型的元素(即你想把T類型的元素加入到列表中),你需要把這個列表聲明成< super T>,比如List< super Integer>,因此你不能保證從中讀取到的元素的類型。

即是生產者,也是消費者

如果一個列表即要生產,又要消費,你不能使用泛型通配符聲明列表,比如List<Integer>。

例子

請參考java.util.Collections里的copy方法(JDK1.7):

泛型中 super T和 extends T的區別

我們可以從Java開發團隊的代碼中獲得到一些啟發,copy方法中使用到了PECS原則,實現了對參數的保護。

 
責任編輯:王雪燕 來源: 并發編程網
相關推薦

2019-12-12 10:25:33

Java泛型編程語言

2012-02-16 10:36:43

Java

2021-07-27 07:31:16

JavaArrayList數組

2009-03-17 16:22:13

Java泛型接口

2023-10-07 00:01:02

Java函數

2009-09-25 10:03:51

Java泛型

2021-06-17 06:51:32

Java泛型Java編程

2024-01-24 08:31:13

extends?接口規范

2023-12-15 10:11:31

數據結構方式

2017-03-06 16:51:52

Java泛型實現

2011-07-08 13:40:18

2021-09-29 18:17:30

Go泛型語言

2024-04-23 08:23:36

TypeScript泛型Generics

2009-09-14 18:57:19

LINQ查詢

2021-12-30 19:34:15

Java泛型JDK

2009-06-16 11:32:00

Java泛型

2020-10-26 14:01:22

Java泛型

2011-06-03 08:49:54

Java

2009-06-11 17:31:27

Java泛型

2010-07-20 13:52:27

SQL Server
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人综合在线 | 视频一区二区国产 | av一区二区三区四区 | 黄色毛片黄色毛片 | 日本特黄a级高清免费大片 国产精品久久性 | 日韩欧美在线一区二区 | 中文字幕在线观看视频一区 | 亚洲免费网 | 亚洲一区二区不卡在线观看 | 日日夜夜精品视频 | 久久久久久综合 | 国产精品久久久久久久午夜片 | av一级久久 | 天天干夜夜拍 | 亚洲国产欧美国产综合一区 | 在线看片网站 | 精品自拍视频在线观看 | 国产综合精品 | 久久成人一区二区三区 | 成人av影院 | 免费xxxx大片国产在线 | 欧美一级欧美一级在线播放 | 黄色大片免费网站 | 男女视频网站 | 黄色大片免费观看 | 免费在线观看av片 | 国产精品视频在线观看 | 午夜电影福利 | 久久草视频 | 国产av毛片 | 午夜精品久久久久久久99黑人 | 一本大道久久a久久精二百 国产成人免费在线 | 国产aaaaav久久久一区二区 | 日韩精品在线看 | 电影午夜精品一区二区三区 | 日本人做爰大片免费观看一老师 | 羞羞涩涩在线观看 | 毛片免费观看视频 | 97久久精品午夜一区二区 | 久热久草 | 99福利|