溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 中super T和extends T的區別是什么

發布時間:2021-07-01 17:36:52 來源:億速云 閱讀:248 作者:Leah 欄目:編程語言

Java 中super T和extends T的區別是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

extends

List< extends Number> foo3的通配符聲明,意味著以下的賦值是合法的:  // Number "extends" Number (in this context)  List< extends Number> foo3 = new ArrayList< extends Number>();  // Integer extends Number  List< extends Number> foo3 = new ArrayList< extends Integer>();  // Double extends Number  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>。

List< super Integer> foo3的通配符聲明,意味著以下賦值是合法的:  // Integer is a "superclass" of Integer (in this context)  List< super Integer> foo3 = new ArrayList<Integer>();  // Number is a superclass of Integer  List< super Integer> foo3 = new ArrayList<Number>();  // Object is a superclass of Integer  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):

Java 中super T和extends T的區別是什么

看完上述內容,你們掌握Java 中super T和extends T的區別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女