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

淺談java泛型的作用及其基本概念

 更新時(shí)間:2016年08月18日 09:51:08   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談java泛型的作用及其基本概念。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一、泛型的基本概念

java與c#一樣,都存在泛型的概念,及類型的參數(shù)化。java中的泛型是在jdk5.0后出現(xiàn)的,但是java中的泛型與C#中的泛型是有本質(zhì)區(qū)別的,首先從集合類型上來(lái)說(shuō),java 中的ArrayList<Integer>和ArrayList<String>是同一個(gè)類型,在編譯時(shí)會(huì)執(zhí)行類型擦除,及java中的類型是偽泛型,偽泛型將會(huì)在后面介紹,其次,對(duì)于像集合中添加基本類型的數(shù)據(jù)時(shí),例如int,會(huì)首先將int轉(zhuǎn)化成Integer對(duì)象,即我們通常所說(shuō)的裝箱操作,在取出元素的時(shí)候需要將Interger對(duì)象轉(zhuǎn)換成int值類型,即拆箱操作。而在c#中,List<int>和List<string>是不同的類型,泛型參數(shù)在編譯后會(huì)是一個(gè)占位符,并沒(méi)有被擦除,在運(yùn)行時(shí)被賦予正真的類型,它們?cè)谙到y(tǒng)運(yùn)行期生成,有自己的虛方法表和類型數(shù)據(jù),這種實(shí)現(xiàn)稱為類型膨脹(針對(duì)類型膨脹,即時(shí)編譯器已經(jīng)做了很多的優(yōu)化工作來(lái)解決這一問(wèn)題),這就是所謂的真泛型。與此同時(shí),在對(duì)集合中添加基本元素如int時(shí),不需要裝箱操作,取出元素時(shí)不需要拆箱操作,因此,性能上較java的集合泛型要好。

java中泛型的引入主要是為了解決兩個(gè)方面的問(wèn)題:1.集合類型元素在運(yùn)行期出現(xiàn)類型裝換異常,增加編譯時(shí)類型的檢查,2. 解決的時(shí)重復(fù)代碼的編寫,能夠復(fù)用算法。下面通過(guò)例子來(lái)說(shuō)明編譯器的類型檢查。

首先我們看一個(gè)沒(méi)有使用泛型的例子:

ArrayList al = new ArrayList(); 
  al.add("abc"); 
  al.add("124"); 
  al.add("32L"); 

我們可以向al集合中添加任何類型的數(shù)據(jù)。當(dāng)我們?cè)谌〕鰯?shù)據(jù)的時(shí)候需要時(shí)候類型轉(zhuǎn)換,如:

String s = (String)al.get(0);
String s1 = (String)al.get(1); //在運(yùn)行期,會(huì)報(bào)錯(cuò),類型轉(zhuǎn)換錯(cuò)誤
Long l = (Long)al.get(2);

由此可以看到,沒(méi)有泛型的時(shí)候,減少了編譯時(shí)的類型檢查,在取出元素時(shí)需要程序員對(duì)每個(gè)元素的類型都了解,否則很可能在運(yùn)行時(shí)出現(xiàn)類型轉(zhuǎn)換的異常。

 

那么下面我們通過(guò)泛型集合來(lái)看看他給我們帶來(lái)的好處。

ArrayList<String> al1 = new ArrayList<String>();
al1.add("abc");
al1.add(1);  //編譯時(shí)報(bào)錯(cuò),

當(dāng)我們用String參數(shù)類型實(shí)例化al1后,我們是不能添加int元素的,否則編譯器會(huì)報(bào)錯(cuò),通常在IDE編輯器,如eclipse中會(huì)有錯(cuò)誤標(biāo)識(shí),與此同時(shí),在取出元素也不需要類型轉(zhuǎn)換.

string value = al1.get(0); //不需要類型轉(zhuǎn)換

這便是泛型所帶來(lái)的好處。

那么算法的復(fù)用主要是體現(xiàn)在,方法的復(fù)用,如ArrayList的Add方法可以使用在任何類型上或限定的類型上。

二、泛型的使用

java中的泛型主要使用在類,方法,與接口中。首先,我們來(lái)簡(jiǎn)單的看看在類上的使用:

class Factory<T>{ 
  private T value; 
  public T getValue() 
  { 
    return value; 
  } 
  public void setValue(T v) 
  { 
    this.value = v; 
  } 
} 

添加測(cè)試方法:

Factory<String> f = new Factory<String>(); 
f.setValue("factory in use"); 
System.out.println(f.getValue()); 

泛型接口的使用:

interface MyInterface<T,U>{ 
 
  void show(T t, U u); 
} 
 
class ShowTest implements MyInterface<String,Integer>{ 
 
  @Override 
  public void show(String t, Integer u) { 
    System.out.println(t); 
    System.out.println(u); 
 
  } 
 
} 

泛型類型參數(shù)作用于類上的時(shí)候主要是對(duì)多個(gè)字段及方法簽名之間的類型約束。作用于方法的時(shí)候主要是對(duì)方法的的多個(gè)參數(shù)做相應(yīng)的約束,在這里方法的泛型類型參數(shù)不再舉例,下面我們主要介紹類型參數(shù)的約束。

三、類型參數(shù)約束

我們看一個(gè)小例子,如下代碼所示:

public static <T> T get(T t1,T t2) {  
  if(t1.compareTo(t2)>=0);//編譯錯(cuò)誤 ,the method compareTo(T) is undefined for the type T. 
  return t1;  
} 

可以看到編譯器報(bào)錯(cuò)的信息,對(duì)于類型T沒(méi)有定義compareTo方法,在java中類型需要比較的話需要實(shí)現(xiàn)Comparable接口,從而重寫該方法?!∧敲次覀冏鋈缦滦薷模?/p>

public static <T extends Comparable> T get(T t1,T t2) { //添加類型限定  
    if(t1.compareTo(t2)>=0);  
    return t1;  
  } 

通過(guò)限定T extends Comparable 表明,T是實(shí)現(xiàn)了Comparable的接口的類型,因此也實(shí)現(xiàn)了compareTo方法,因此不會(huì)產(chǎn)生編譯期錯(cuò)誤。

類型的多個(gè)限定時(shí)我們可以使用&來(lái)進(jìn)行分割,并且限定的關(guān)鍵詞只能使用extends。與此同時(shí)在接口與類型都存在的情況下,類只能放在第一個(gè),并且只能有一個(gè),如下所示:

<T extends Object&Comparable&Serializable> 

以上這篇淺談java泛型的作用及其基本概念就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案

    SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案

    因?yàn)樾枰⑿刑幚硗粡垟?shù)據(jù)表里的數(shù)據(jù),所以比較自然地想到了分片查詢數(shù)據(jù),可以利用對(duì) id 取模的方法進(jìn)行分片,避免同一條數(shù)據(jù)被重復(fù)處理,所以本文給大家介紹了SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案,需要的朋友可以參考下
    2024-09-09
  • Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法

    Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法,實(shí)例分析了java基于ITextRenderer類操作頁(yè)面及系統(tǒng)自帶字體生成pdf文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java Swing組件定制CheckBox示例

    Java Swing組件定制CheckBox示例

    這篇文章主要介紹了Java Swing組件定制CheckBox,涉及Java swing組件CheckBox相關(guān)屬性與設(shè)置操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java基礎(chǔ)之匿名內(nèi)部類、包裝類

    Java基礎(chǔ)之匿名內(nèi)部類、包裝類

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 解決springboot運(yùn)行出現(xiàn)錯(cuò)誤:找不到或無(wú)法加載主類com.xxxx.xxxx.Application問(wèn)題

    解決springboot運(yùn)行出現(xiàn)錯(cuò)誤:找不到或無(wú)法加載主類com.xxxx.xxxx.Application問(wèn)題

    文章介紹了在服務(wù)器上運(yùn)行一個(gè)未使用的Java項(xiàng)目時(shí)遇到的“找不到或無(wú)法加載主類”錯(cuò)誤,并提供了兩種解決方法:通過(guò)Maven install或build …、Goals輸入install并跳過(guò)測(cè)試來(lái)重新構(gòu)建項(xiàng)目
    2024-11-11
  • mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    這篇文章主要介紹了mybatis項(xiàng)目CRUD步驟,包括pom.xml引入相應(yīng)的依賴,在resources目錄下寫配置文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出的示例代碼

    Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach

    MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach

    這篇文章主要介紹了MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java Springboot自動(dòng)裝配原理詳解

    Java Springboot自動(dòng)裝配原理詳解

    這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-10-10
  • Spring的IOC控制反轉(zhuǎn)詳解

    Spring的IOC控制反轉(zhuǎn)詳解

    這篇文章主要為大家介紹了Spring的IOC控制反轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01

最新評(píng)論

呼伦贝尔市| 武山县| 常熟市| 延安市| 安图县| 泰来县| 高安市| 芦溪县| 黄石市| 苍山县| 嵊泗县| 兴安盟| 读书| 乐都县| 辽源市| 乌拉特前旗| 扎赉特旗| 井陉县| 紫阳县| 九寨沟县| 黔江区| 福建省| 嘉义县| 得荣县| 安溪县| 鄯善县| 长沙市| 侯马市| 昆明市| 乐安县| 井冈山市| 衡水市| 南岸区| 镶黄旗| 岳阳县| 原平市| 梅州市| 额敏县| 连江县| 思茅市| 寿宁县|