最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 泛型實(shí)例詳解

 更新時(shí)間:2016年07月20日 18:02:32   投稿:lqh  
本文主要介紹Java 泛型的知識(shí),這里給代碼實(shí)例對(duì)Java 泛型深度理解,有需要的朋友可以看下

理解Java泛型最簡(jiǎn)單的方法是把它看成一種便捷語(yǔ)法,能節(jié)省你某些Java類(lèi)型轉(zhuǎn)換(casting)上的操作:

      List<Apple> box = ...;
 	Apple apple = box.get(0);

上面的代碼自身已表達(dá)的很清楚:box是一個(gè)裝有Apple對(duì)象的List。get方法返回一個(gè)Apple對(duì)象實(shí)例,這個(gè)過(guò)程不需要進(jìn)行類(lèi)型轉(zhuǎn)換。沒(méi)有泛型,上面的代碼需要寫(xiě)成這樣:

      List box = ...;
 	Apple apple = (Apple) box.get(0);

很明顯,泛型的主要好處就是讓編譯器保留參數(shù)的類(lèi)型信息,執(zhí)行類(lèi)型檢查,執(zhí)行類(lèi)型轉(zhuǎn)換操作:編譯器保證了這些類(lèi)型轉(zhuǎn)換的絕對(duì)無(wú)誤。相對(duì)于依賴(lài)程序員來(lái)記住對(duì)象類(lèi)型、執(zhí)行類(lèi)型轉(zhuǎn)換——這會(huì)導(dǎo)致程序運(yùn)行時(shí)的失敗,很難調(diào)試和解決,而編譯器能夠幫助程序員在編譯時(shí)強(qiáng)制進(jìn)行大量的類(lèi)型檢查,發(fā)現(xiàn)其中的錯(cuò)誤。

泛型的構(gòu)成

由泛型的構(gòu)成引出了一個(gè)類(lèi)型變量的概念。根據(jù)Java語(yǔ)言規(guī)范,類(lèi)型變量是一種沒(méi)有限制的標(biāo)志符,產(chǎn)生于以下幾種情況:

    泛型類(lèi)聲明
    泛型接口聲明
    泛型方法聲明
    泛型構(gòu)造器(constructor)聲明

泛型類(lèi)和接口

如果一個(gè)類(lèi)或接口上有一個(gè)或多個(gè)類(lèi)型變量,那它就是泛型。類(lèi)型變量由尖括號(hào)界定,放在類(lèi)或接口名的后面:

public interface List<T> extends Collection<T> {
	...
	}

簡(jiǎn)單的說(shuō),類(lèi)型變量扮演的角色就如同一個(gè)參數(shù),它提供給編譯器用來(lái)類(lèi)型檢查的信息。

Java類(lèi)庫(kù)里的很多類(lèi),例如整個(gè)Collection框架都做了泛型化的修改。例如,我們?cè)谏厦娴牡谝欢未a里用到的List接口就是一個(gè)泛型類(lèi)。在那段代碼里,box是一個(gè)List<Apple>對(duì)象,它是一個(gè)帶有一個(gè)Apple類(lèi)型變量的List接口的類(lèi)實(shí)現(xiàn)的實(shí)例。編譯器使用這個(gè)類(lèi)型變量參數(shù)在get方法被調(diào)用、返回一個(gè)Apple對(duì)象時(shí)自動(dòng)對(duì)其進(jìn)行類(lèi)型轉(zhuǎn)換。

實(shí)際上,這新出現(xiàn)的泛型標(biāo)記,或者說(shuō)這個(gè)List接口里的get方法是這樣的:

T get(int index);

get方法實(shí)際返回的是一個(gè)類(lèi)型為T(mén)的對(duì)象,T是在List<T>聲明中的類(lèi)型變量。

泛型方法和構(gòu)造器(Constructor)

非常的相似,如果方法和構(gòu)造器上聲明了一個(gè)或多個(gè)類(lèi)型變量,它們也可以泛型化。

public static <t> T getFirst(List<T> list)

這個(gè)方法將會(huì)接受一個(gè)List<T>類(lèi)型的參數(shù),返回一個(gè)T類(lèi)型的對(duì)象。你既可以使用Java類(lèi)庫(kù)里提供的泛型類(lèi),也可以使用自己的泛型類(lèi)。類(lèi)型安全的寫(xiě)入數(shù)據(jù)…下面的這段代碼是個(gè)例子,我們創(chuàng)建了一個(gè)List<String>實(shí)例,然后裝入一些數(shù)據(jù):

List<String> str = new ArrayList<String>();
 	str.add("Hello ");
 	str.add("World.");

如果我們?cè)噲D在List<String>裝入另外一種對(duì)象,編譯器就會(huì)提示錯(cuò)誤:

str.add(1);

類(lèi)型安全的讀取數(shù)據(jù)…

當(dāng)我們?cè)谑褂肔ist<String>對(duì)象時(shí),它總能保證我們得到的是一個(gè)String對(duì)象:

String myString = str.get(0);

遍歷:類(lèi)庫(kù)中的很多類(lèi),諸如Iterator<T>,功能都有所增強(qiáng),被泛型化。List<T>接口里的iterator()方法現(xiàn)在返回的是Iterator<T>,由它的T next()方法返回的對(duì)象不需要再進(jìn)行類(lèi)型轉(zhuǎn)換,你直接得到正確的類(lèi)型。

for (Iterator<String> iter = str.iterator(); iter.hasNext();) {
	String s = iter.next();
	System.out.print(s);
	}

使用foreach,“for each”語(yǔ)法同樣受益于泛型。前面的代碼可以寫(xiě)出這樣:

for (String s: str) {
	System.out.print(s);
	}

這樣既容易閱讀也容易維護(hù)。

自動(dòng)封裝(Autoboxing)和自動(dòng)拆封(Autounboxing),在使用Java泛型時(shí),autoboxing/autounboxing這兩個(gè)特征會(huì)被自動(dòng)的用到,就像下面的這段代碼:

List<Integer> ints = new ArrayList<Integer>();
 	ints.add(0);
	ints.add(1);
 	
	int sum = 0;
	for (int i : ints) {
 	sum += i;
 	}

然而,你要明白的一點(diǎn)是,封裝和解封會(huì)帶來(lái)性能上的損失,所有,通用要謹(jǐn)慎的使用。

泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類(lèi)型,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)。這種參數(shù)類(lèi)型可以用在類(lèi)、接口和方法的創(chuàng)建中,分別稱(chēng)為泛型類(lèi)、泛型接口、泛型方法。

Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。

在Java SE 1.5之前,沒(méi)有泛型的情況的下,通過(guò)對(duì)類(lèi)型Object的引用來(lái)實(shí)現(xiàn)參數(shù)的“任意化”,“任意化”帶來(lái)的缺點(diǎn)是要做顯式的強(qiáng)制類(lèi)型轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開(kāi)發(fā)者對(duì)實(shí)際參數(shù)類(lèi)型可以預(yù)知的情況下進(jìn)行的。對(duì)于強(qiáng)制類(lèi)型轉(zhuǎn)換錯(cuò)誤的情況,編譯器可能不提示錯(cuò)誤,在運(yùn)行的時(shí)候才出現(xiàn)異常,這是一個(gè)安全隱患。

泛型的好處是在編譯的時(shí)候檢查類(lèi)型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。

泛型在使用中還有一些規(guī)則和限制:

1、泛型的類(lèi)型參數(shù)只能是類(lèi)類(lèi)型(包括自定義類(lèi)),不能是簡(jiǎn)單類(lèi)型。

2、同一種泛型可以對(duì)應(yīng)多個(gè)版本(因?yàn)閰?shù)類(lèi)型是不確定的),不同版本的泛型類(lèi)實(shí)例是不兼容的。

3、泛型的類(lèi)型參數(shù)可以有多個(gè)。

4、泛型的參數(shù)類(lèi)型可以使用extends語(yǔ)句,例如。習(xí)慣上成為“有界類(lèi)型”。

5、泛型的參數(shù)類(lèi)型還可以是通配符類(lèi)型。例如Class classType = Class.forName(java.lang.String);

泛型還有接口、方法等等,內(nèi)容很多,需要花費(fèi)一番功夫才能理解掌握并熟練應(yīng)用。在此給出我曾經(jīng)了解泛型時(shí)候?qū)懗龅膬蓚€(gè)例子(根據(jù)看的印象寫(xiě)的),實(shí)現(xiàn)同樣的功能,一個(gè)使用了泛型,一個(gè)沒(méi)有使用,通過(guò)對(duì)比,可以很快學(xué)會(huì)泛型的應(yīng)用,學(xué)會(huì)這個(gè)基本上學(xué)會(huì)了泛型70%的內(nèi)容。

例子一:使用了泛型

public class Gen﹤T﹥ {
 private T ob; //定義泛型成員變量

 public Gen(T ob) {
this.ob = ob;
 }

 public T getOb() {
return ob;
 }

 public void setOb(T ob) {
this.ob = ob;
 }

 public void showTyep() {
System.out.println("T的實(shí)際類(lèi)型是: " + ob.getClass().getName());
 }
}

public class GenDemo {
 public static void main(String[] args){
 //定義泛型類(lèi)Gen的一個(gè)Integer版本
 Gen﹤Integer﹥ intOb=new Gen﹤Integer﹥(88);
 intOb.showTyep();
 int i= intOb.getOb();
 System.out.println("value= " + i);

 System.out.println("----------------------------------");

 //定義泛型類(lèi)Gen的一個(gè)String版本
 Gen﹤String﹥ strOb=new Gen﹤String﹥("Hello Gen!");
 strOb.showTyep();
 String s=strOb.getOb();
 System.out.println("value= " + s);
}

例子二:沒(méi)有使用泛型

public class Gen2 {
 private Object ob; //定義一個(gè)通用類(lèi)型成員

 public Gen2(Object ob) {
this.ob = ob;
 }

 public Object getOb() {
return ob;
 }

 public void setOb(Object ob) {
this.ob = ob;
 }

 public void showTyep() {
System.out.println("T的實(shí)際類(lèi)型是: " + ob.getClass().getName());
 }
}

public class GenDemo2 {
 public static void main(String[] args) {
//定義類(lèi)Gen2的一個(gè)Integer版本
Gen2 intOb = new Gen2(new Integer(88));
intOb.showTyep();
int i = (Integer) intOb.getOb();
System.out.println("value= " + i);

System.out.println("----------------------------------");

//定義類(lèi)Gen2的一個(gè)String版本
Gen2 strOb = new Gen2("Hello Gen!");
strOb.showTyep();
String s = (String) strOb.getOb();
System.out.println("value= " + s);
 }
} 

運(yùn)行結(jié)果:

兩個(gè)例子運(yùn)行Demo結(jié)果是相同的,控制臺(tái)輸出結(jié)果如下:

T的實(shí)際類(lèi)型是:

java.lang.Integer

value= 88

----------------------------------

T的實(shí)際類(lèi)型是: java.lang.String

value= Hello Gen!

Process finished with exit code 0

看明白這個(gè),以后基本的泛型應(yīng)用和代碼閱讀就不成問(wèn)題了。

以上就是對(duì)java泛型的實(shí)例分析,學(xué)習(xí)Java泛型的朋友可以參考下。

相關(guān)文章

  • java 實(shí)現(xiàn)切割文件和合并文件的功能

    java 實(shí)現(xiàn)切割文件和合并文件的功能

    這篇文章主要介紹了java 實(shí)現(xiàn)切割文件和合并文件的功能的相關(guān)資料,這里實(shí)現(xiàn)文件的切割的實(shí)現(xiàn)代碼和文件合并的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-07-07
  • 將Maven鏡像源更改為阿里鏡像的操作步驟

    將Maven鏡像源更改為阿里鏡像的操作步驟

    在軟件開(kāi)發(fā)中,Maven是一個(gè)流行的項(xiàng)目管理工具,它允許你從Maven中央倉(cāng)庫(kù)下載所需的依賴(lài)包,然而,由于地理位置或網(wǎng)絡(luò)狀況的差異,從默認(rèn)的Maven中央倉(cāng)庫(kù)下載依賴(lài)包的速度可能會(huì)較慢,所
    2025-01-01
  • java8列表中通過(guò)stream流根據(jù)對(duì)象屬性去重的三種方式

    java8列表中通過(guò)stream流根據(jù)對(duì)象屬性去重的三種方式

    這篇文章主要介紹了java8列表中通過(guò)stream流根據(jù)對(duì)象屬性去重的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring?Aop常見(jiàn)注解與執(zhí)行順序詳解

    Spring?Aop常見(jiàn)注解與執(zhí)行順序詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Aop常見(jiàn)注解與執(zhí)行順序的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java實(shí)現(xiàn)圖書(shū)館借閱系統(tǒng)

    Java實(shí)現(xiàn)圖書(shū)館借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖書(shū)館借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java實(shí)現(xiàn)銀行ATM管理系統(tǒng)

    java實(shí)現(xiàn)銀行ATM管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)銀行ATM管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java實(shí)現(xiàn)上傳和下載工具類(lèi)

    java實(shí)現(xiàn)上傳和下載工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳和下載工具類(lèi),文件上傳到ftp服務(wù)工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 使用java代碼實(shí)現(xiàn)保留小數(shù)點(diǎn)的位數(shù)

    使用java代碼實(shí)現(xiàn)保留小數(shù)點(diǎn)的位數(shù)

    因?yàn)閭€(gè)人應(yīng)用的需要,所以就寫(xiě)個(gè)簡(jiǎn)單點(diǎn)的了。希望大家都給給建議,共同學(xué)習(xí)。需要的朋友也可以參考下
    2013-07-07
  • idea2020.1版本git提交項(xiàng)目到github上的方法

    idea2020.1版本git提交項(xiàng)目到github上的方法

    這篇文章主要介紹了idea2020.1版本git提交項(xiàng)目到github上的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Java多線(xiàn)程通信問(wèn)題深入了解

    Java多線(xiàn)程通信問(wèn)題深入了解

    下面小編就為大家?guī)?lái)一篇深入理解JAVA多線(xiàn)程之線(xiàn)程間的通信方式。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07

最新評(píng)論

麻栗坡县| 西乌| 宁津县| 工布江达县| 双城市| 搜索| 开平市| 普定县| 乌拉特前旗| 靖江市| 沙雅县| 安徽省| 汉沽区| 大理市| 兴城市| 大英县| 中宁县| 尤溪县| 霍林郭勒市| 寿宁县| 镇康县| 兴海县| 温宿县| 民县| 内乡县| 沐川县| 锦州市| 婺源县| 绥中县| 合川市| 胶州市| 巴彦县| 潞西市| 辽阳县| 开封县| 和龙市| 三河市| 洞口县| 宜川县| 彰化县| 濮阳县|