為什么使用泛型?
Java編譯器在編譯時加強泛型代碼的類型檢查,避免運行時不可預料的錯誤。
泛型支持程序化類型作為參數(shù),使方法兼具靈活性。
泛型能讓你實現(xiàn)泛型算法,更具有通用性。
泛型類型和方法
泛型類型
參數(shù)化類型的類或接口。
格式:classname<T1,T2,...,Tn>{},其中T1,T2稱為typeparameters。
調(diào)用泛型類型(又稱為參數(shù)化類型):Box<Integer>integerBox,傳入具體的類型。
實例化泛型類型:Box<Integer>integerBox=newBox<Integer>();
泛型方法
參數(shù)化類型的方法。
格式:publicstatic<K,V>booleancompare(Pair<K,V>p1,Pair<K,V>p2),static,non-static均可。
調(diào)用泛型方法:Util.<Integer,String>compare(p1,p2)??梢岳妙愋屯茢?,像調(diào)用普通方法一樣調(diào)用泛型方法,如:Util.compare(p1,p2)
通過extends來限定泛型類型和方法的邊界
通配符和子類型
Integer是Number的子類,但參數(shù)化類型Box<Integer>和Box<Number>沒有關系,他們的共同父類是Object。
泛型類型之間幾乎沒有關系,但可以通過通配符在泛型類型之間建立關系。
???通配符,用于參數(shù)、字段、局部變量的類型,不用于泛型類型和方法。
上界:List<?extendsNumber>,不確定類型是指定類型或指定類型的子類,可以放松對變量的限制,如匹配List<Number>,List<Integer>。例如,List<Number>僅匹配Number類型的List,而List<?extendsNumber>匹配Number類型和其子類的List。
無界:List<?>,不確定類型的List。使用場景:1)List的元素都是Object類型,直接可以使用Object的方法。2)泛型類中的方法不依賴于類型參數(shù)。
下界:List<?superInteger>,不確定類型是指定類型或指定類型的父類,可以盡量提高靈活性,如匹配List<Integer>,List<Number>,List<Object>。
通配符使用的場景
把參數(shù)變量看作兩類:
1、『in』提供給方法內(nèi)部使用,即傳入數(shù)據(jù)。
2、『out』提供給方法外部使用,即傳出數(shù)據(jù)。
利用WildcardCapture特性,通配符使用的場景為:
1、『in』使用上界通配符
2、『out』使用下界通配符
3、『in』可以使用Object的方法,使用無界通配符
4、即用作『in』,又用作『out』的,不使用通配符
泛型的限制
不能用primitive類型實例化泛型。如:Pair<int,char>p=newPair<>(8,'a');
不能實例化參數(shù)類型。如:newE();
不能定義類的靜態(tài)類型字段是參數(shù)類型。如:privatestaticTos;
參數(shù)類型不能使用instanceof和類型轉(zhuǎn)換。如:listinstanceofArrayList<Integer>
不能創(chuàng)建參數(shù)化類型數(shù)組。如:List<Integer>[]arrayOfLists=newList<Integer>[2];
不能Create,Catch,或者Throw參數(shù)化類型對象。如:classMathException<T>extendsException{}
重載方法不能使用參數(shù)化類型被擦除后擁有同樣的原生類型。如:
publicvoidprint(Set<String>strSet){}
publicvoidprint(Set<Integer>intSet){}
被編譯擦除后是一樣的publicvoidprint(SetstrSet){}
以上就是長沙達內(nèi)教育java培訓機構(gòu)小編介紹的“2019年Java泛型用法總結(jié)”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。
相關內(nèi)容
java泛型方法的使用
完整的Java軟件開發(fā)學習路線
Java泛型定義與java用法泛型實例詳解