Java中extends T和super T是什麼
? 通配符型別
表示型別的上界,表示參數化型別的可能是T 或是T的子類別;
# super T> 表示類型下界(Java Core中叫超型別限定),表示參數化型別是此型別的超型別(父型別),直到Object;
上界 extends T>不能往裡面存,只能往外取
比如,我們現在定義:List extends T>首先你很容易誤解它為繼承於T的所有類別的集合,你可能認為,你定義的這個List可以用來put任何T的子類,那麼我們看下面的程式碼:
import java.util.LinkedList; import java.util.List; public class test { public static void main(String[] args) { List<? extends Father> list = new LinkedList<>(); list.add(new Son()); } } class Human{ } class Father extends Human{ } class Son extends Father{ } class LeiFeng extends Father { }
list.add(new Son());這行會報錯:The method put(Son) is undefined for the type List
List extends Father> 表示“具有任何從Son繼承類型的列表” ,編譯器無法確定List所持有的類型,所以無法安全的向其中新增物件。可以加null,因為null 可以表示任何類型。所以List 的add 方法不能加入任何有意義的元素,但可以接受現有的子型別List 賦值。
你也許試圖這樣做:
List<? extends Father> list = new LinkedList<Son>(); list.add(new Son());
即使你指明了為Son類型,也不能用add方法添加一個Son物件。
list中為什麼不能加入Father類別和Father類別的子類別呢,我們來分析下。
List extends Father>表示上限是Father,下面這樣的賦值都是合法的
List<? extends Father> list1 = new ArrayList<Father>(); List<? extends Father> list2 = new ArrayList<Son>(); List<? extends Father> list3 = new ArrayList<LeiFeng>();
如果List extends Father>支持add方法的話:
list1可以add Father和所有Father的子類別;
#list2可以add Son和所有Son的子類別;
list3可以add LeiFeng和所有LeiFeng的子類別。
下面程式碼是編譯不通過的:
list1.add(new Father());//error list1.add(new Son());//error
原因是編譯器只知道容器內是Father或它的衍生類,但具體是什麼型別不知道。可能是Father?可能是Son?也可能是LeiFeng,XiaoMing?編譯器看到後面用Father賦值以後,集合裡並沒有限定參數型別是「Father「。而是標上一個佔位符:CAP#1,來表示捕獲一個Father或Father的子類,具體是什麼類不知道,代號CAP#1。然後無論是想往裡面插入Son或LeiFeng或Father編譯器都不知道能不能跟這個CAP#1匹配,所以就都不允許。
所以通配符>和型別參數的差別就在於,對編譯器來說所有的T都代表同一種型別。例如下面這個泛型方法裡,三個T都指同一個類型,要嘛都是String,要嘛都是Integer。
public <T> List<T> fill(T... t);
但通配符>沒有這種約束,List>單純的就表示:集合裡放了一個東西,是什麼我不知道。
所以這裡的錯誤就在這裡,List extends Father>裡面什麼都放不進去。
List extends Father> list不能進行add,但是,這種形式還是很有用的,雖然不能使用add方法,但是可以在初始化的時候一個Season指定不同的類型。例如:
List<? extends Father> list1 = getFatherList();//getFatherList方法会返回一个Father的子类的list
另外,由於我們已經保證了List中保存的是Father類別或他的某一個子類,所以,可以用get方法直接得到值:
List<? extends Father> list1 = new ArrayList<>(); Father father = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Object object = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Human human = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Son son = (Son)list1.get(0);
下界< ;? super T>不影響往裡存,但往外取只能放在Object物件裡
下界用super進行聲明,表示參數化的類型可能是所指定的類型,或是此類型的父類型,直至Object。
//super只能添加Father和Father的子类,不能添加Father的父类,读取出来的东西只能存放在Object类里 List<? super Father> list = new ArrayList<>(); list.add(new Father()); list.add(new Human());//compile error list.add(new Son()); Father person1 = list.get(0);//compile error Son son = list.get(0);//compile error Object object1 = list.get(0);
因為下界規定了元素的最小粒度的下限,實際上是放鬆了容器元素的類型控制。既然元素是Father的基底類,那往裡面存粒度比Father小的都可以。出於對型別安全的考慮,我們可以加入Father物件或其任何子類別(如Son)對象,但由於編譯器並不知道List的內容究竟是Father的哪個超類,因此不允許加入特定的任何超類(如Human)。而當我們讀取的時候,編譯器在不知道是什麼類型的情況下只能回傳Object對象,因為Object是任何Java類別的最終祖先類別。但這樣的話,元素的類型資訊就全部遺失了。
PECS原則
最後看看什麼是PECS(Producer Extends Consumer Super)原則,已經很好理解了:
頻繁往外讀取內容的,適合用上界Extends。
常往內插入的,適合用下界Super。
以上是Java中extends T和super T是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
