java中的泛型的使用与理解
什么是泛型?
泛型是程序設(shè)計語言的一種特性。允許程序員在強(qiáng)類型程序設(shè)計語言中編寫 體驗泛型
代碼時定義一些可變部份,那些部份在使用前必須作出指明。各種程序設(shè)計語言和其編譯器、運(yùn)行環(huán)境對泛型的支持均不一樣。將類型參數(shù)化以達(dá)到代碼復(fù)用提高軟件開發(fā)工作效率的一種數(shù)據(jù)類型。泛型類是引用類型,是堆對象,主要是引入了類型參數(shù)這個概念。
?
定義:
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。
在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點(diǎn)是要做顯式的強(qiáng)制類型
轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開發(fā)者對實際參數(shù)類型可以預(yù)知的情況下進(jìn)行的。對于強(qiáng)制類型轉(zhuǎn)換錯誤的情況,編譯器可能不提示錯誤,在運(yùn)行的時候才出現(xiàn)異常,這是一個安全隱患。
泛型的好處:
??? 泛型的好處是在編譯的時候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動和隱式的,提高代碼的重用率。
??? 1、泛型的類型參數(shù)只能是類類型(包括自定義類),不能是簡單類型。
??? 2、同一種泛型可以對應(yīng)多個版本(因為參數(shù)類型是不確定的),不同版本的泛型類實例是不兼容的。
??? 3、泛型的類型參數(shù)可以有多個。
??? 4、泛型的參數(shù)類型可以使用extends語句,例如<T extends superclass>。習(xí)慣上稱為“有界類型”。
??? 5、泛型的參數(shù)類型還可以是通配符類型。例如Class<?> classType = Class.forName("java.lang.String");
?
注意:
- 泛型是 Java 1.5 的新增特性,它以C++模板為參照,本質(zhì)是參數(shù)化類型(Parameterized Type)的應(yīng)用。
- 類型參數(shù)只能用來表示引用類型,泛型在Java中要求,泛型傳入的必須是包裝類型,必須是Object類型的,或者是自定義的類,不能傳入基本類型例如? int、double、char 等。,必須要傳包裝類型如Integer不能用來表示基本類型,但是傳遞基本類型不會報錯,因為它們會自動裝箱成對應(yīng)的包裝類。
運(yùn)用:
1 /*iG相當(dāng)于占位符,用來傳遞數(shù)據(jù)類型,而不是數(shù)據(jù)的值,稱為類型參數(shù)(名字可以自定義,當(dāng)然更多的時候我們得按照規(guī)范來) 2 * 3 */ 4 //自定義泛型類,多個泛型之間可以用逗號隔開如<iG,iT,..> 5 class MyArrays<iG>{ //類的泛型必須要放在類名的后面 6 //調(diào)換數(shù)組的元素的位置 7 public void rever(iG[] a){ 8 System.out.println(a); 9 } 10 } 11 public class customToolClass { 12 public static void main(String[] args){ 13 String[] str=new String[10]; 14 Integer[] intArr = new Integer[10]; 15 //不能傳基本數(shù)據(jù)類型,就算是整形數(shù)組,如int[],也要傳int的包裝類Integer 16 int[] arr = new int[10]; 17 // MyArrays<int> my1 = new MyArray<int>(); //不能是基本數(shù)據(jù)類型 18 MyArrays<Integer> my2 = new MyArrays<Integer>(); // 只能是包裝類 19 //my2.rever(arr); //不能是整形數(shù)組 20 //標(biāo)準(zhǔn)格式是這樣的,兩邊的類型要匹配 21 MyArrays<String> aa = new MyArrays<String>(); 22 aa.rever(str); 23 //下面這兩種也是可以的,但是不推薦,這是java為了向下兼容以前的版本設(shè)計的 24 MyArrays<String> cc = new MyArrays(); 25 MyArrays dd = new MyArrays<String>(); 26 //-------------------------------------------------------------- 27 MyArrays<Integer> aa1 = new MyArrays<Integer>(); 28 aa1.rever(intArr); 29 } 30 }?
?與普通類的定義相比,上面的代碼在類名后面多出了 <iG> ,iG?是自定義的標(biāo)識符,也是參數(shù),用來傳遞數(shù)據(jù)的類型,而不是數(shù)據(jù)的值,我們稱之為類型參數(shù)。在泛型中,不但數(shù)據(jù)的值可以通過參數(shù)傳遞,數(shù)據(jù)的類型也可以通過參數(shù)傳遞。iG只是數(shù)據(jù)類型的占位符,運(yùn)行時會被替換為真正的數(shù)據(jù)類型。
傳值參數(shù)(我們通常所說的參數(shù))由小括號包圍,如?(int x, double y),類型參數(shù)(泛型參數(shù))由尖括號包圍,多個參數(shù)由逗號分隔,如 <T> 或 <T, E>。注意:這只是個規(guī)范,名稱可以自定義的。
類型參數(shù)需要在類名后面給出。一旦給出了類型參數(shù),就可以在類中使用了。類型參數(shù)必須是一個合法的標(biāo)識符,習(xí)慣上使用單個大寫字母,通常情況下,K 表示鍵,V 表示值,E 表示異常或錯誤,T 表示一般意義上的數(shù)據(jù)類型。
泛型類在實例化時必須指出具體的類型,也就是向類型參數(shù)傳值,格式為:
? ? className variable<dataType1, dataType2> = new className<dataType1, dataType2>();
也可以省略等號右邊的數(shù)據(jù)類型,但是會產(chǎn)生警告,即:
? ? className variable<dataType1, dataType2> = new className();
因為在使用泛型類時指明了數(shù)據(jù)類型,賦給其他類型的值會拋出異常,既不需要向下轉(zhuǎn)型,也沒有潛在的風(fēng)險,比本文一開始介紹的自動裝箱和向上轉(zhuǎn)型要更加實用。
測試效果圖:
轉(zhuǎn)載于:https://www.cnblogs.com/qq1871707128/p/6118156.html
總結(jié)
以上是生活随笔為你收集整理的java中的泛型的使用与理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive几种数据导入方式
- 下一篇: 如何在C/S下打印报表