JAVA泛型的使用

泛型技術(shù)在C#和Java之中的使用方式看似相同伙窃,但實(shí)現(xiàn)上卻有著根本性的分歧,C#里面泛型無(wú)論在程序源碼中袁波、編譯后的IL中(Intermediate Language耻蛇,中間語(yǔ)言,這時(shí)候泛型是一個(gè)占位符)或是運(yùn)行期的CLR中都是切實(shí)存在的朝蜘,List<int>與List<String>就是兩個(gè)不同的類型恶迈,它們?cè)谙到y(tǒng)運(yùn)行期生成,有自己的虛方法表和類型數(shù)據(jù)谱醇,這種實(shí)現(xiàn)稱為類型膨脹暇仲,基于這種方法實(shí)現(xiàn)的泛型被稱為真實(shí)泛型。
Java語(yǔ)言中的泛型則不一樣副渴,它只在程序源碼中存在奈附,在編譯后的字節(jié)碼文件中,就已經(jīng)被替換為原來(lái)的原始類型(Raw Type煮剧,也稱為裸類型)了斥滤,并且在相應(yīng)的地方插入了強(qiáng)制轉(zhuǎn)型代碼,因此對(duì)于運(yùn)行期的Java語(yǔ)言來(lái)說(shuō)勉盅,ArrayList<int>與ArrayList<String>就是同一個(gè)類佑颇。所以說(shuō)泛型技術(shù)實(shí)際上是Java語(yǔ)言的一顆語(yǔ)法糖,Java語(yǔ)言中的泛型實(shí)現(xiàn)方法稱為類型擦除草娜,基于這種方法實(shí)現(xiàn)的泛型被稱為偽泛型挑胸。(類型擦除在后面在學(xué)習(xí))
使用泛型機(jī)制編寫(xiě)的程序代碼要比那些雜亂的使用Object變量,然后再進(jìn)行強(qiáng)制類型轉(zhuǎn)換的代碼具有更好的安全性和可讀性宰闰。泛型對(duì)于集合類來(lái)說(shuō)尤其有用茬贵。

在使用泛型之前,先了解下泛型的幾個(gè)基本概念移袍,以ArrayList<E>和ArrayList<Integer>做簡(jiǎn)要介紹:
整個(gè)成為ArrayList<E>泛型類型
ArrayList<E>中的 E稱為類型變量或者類型參數(shù)
整個(gè)ArrayList<Integer> 稱為參數(shù)化的類型
ArrayList<Integer>中的integer稱為類型參數(shù)的實(shí)例或者實(shí)際類型參數(shù)
·ArrayList<Integer>中的<Integer>念為typeof Integer
ArrayList稱為原始類型

泛型的使用

泛型有以下三種解藻,分別是泛型類、泛型接口和泛型方法

1.泛型類

1.1簡(jiǎn)單泛型類的使用

泛型類就是具有一個(gè)或多個(gè)類型變量的類咐容,泛型類是在多個(gè)方法簽名間實(shí)施類型約束舆逃。在 List<V> 中,類型參數(shù) V 出現(xiàn)在 get()戳粒、add()路狮、contains() 等方法的簽名中。當(dāng)創(chuàng)建一個(gè) Map<K, V> 類型的變量時(shí)蔚约,您就在方法之間宣稱一個(gè)類型約束奄妨。您傳遞給 add() 的值將與 get() 返回的值的類型相同。泛型類的使用很簡(jiǎn)單苹祟,如下

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

使用的時(shí)候我們可以這樣定義Pair<String> pair=new Pair<String>("Hello");
Pair類引入了一個(gè)類型變量T砸抛,用尖括號(hào)<>括起來(lái)评雌,并放在類名的后面。泛型類可以有多個(gè)類型變量直焙。例如景东,可以定義Pair類,其中第一個(gè)域和第二個(gè)域使用不同的類型:public class Pair<T,U>{......}

1.2泛型返回類型的方法

下面的代碼列舉了使用一個(gè)在普通類ArrayAlg中返回類型為泛型的方法minmax奔誓,用其來(lái)獲取字符串?dāng)?shù)組words中的字符串字典排序斤吐。

class ArrayAlg  
{  
   public static Pair<String> minmax(String[] a)  
   {  
      if (a == null || a.length == 0) return null;  
      String min = a[0];  
      String max = a[0];  
      for (int i = 1; i < a.length; i++)  
      {  
         if (min.compareTo(a[i]) > 0) min = a[i];  
         if (max.compareTo(a[i]) < 0) max = a[i];  
      }  
      return new Pair<String>(min, max);  
   }  
} 

2.泛型接口

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

3.泛型方法

泛型方法是因?yàn)槟胍谠摲椒ǖ亩鄠€(gè)參數(shù)之間宣稱一個(gè)類型約束。如下:

3.1普通類中的泛型方法

public class Pair    
{    
       public static <T> T getMiddle(T[] b) {  
           return b[b.length/2];  
        } 
    
  }

這個(gè)方法是用在普通類中定義的厨喂,而不是用在泛型類中定義和措。但是,這是一個(gè)泛型方法蜕煌,這一點(diǎn)可以從尖括號(hào)和類型變量中看出來(lái)派阱。 需要注意的是,類型變量放在修飾符的后面斜纪,返回類型的前面贫母。當(dāng)然泛型方法可以定義在普通類中,也可以定義在泛型類中傀广。
泛型方法的調(diào)用

String[] names = { "mmj", "geeeeg.", "sa" };  
String middle = ArrayAlg.<String>getMiddle(names);  

在這種情況下颁独,方法調(diào)用中可以省略掉<String>類型參數(shù)彩届。編譯器有足夠的信息來(lái)判斷出多調(diào)用的方法伪冰。它用的names的類型(即String[ ]類型)與泛型類型T[ ]進(jìn)行匹配,并且判斷出T一定是String樟蠕。也就是說(shuō)String middle = ArrayAlg.getMiddle(names)也是對(duì)的

3.2泛型類中的泛型方法

public class Pair<T>     
{        
   public Pair() { first = null; second = null; }    
   public Pair(T middle){ this.middle = middle;} 
   //泛型方法
   public T getSth1<T>(T t)
    {
          return t贮聂;
    }
     public void getSth2<T>(T t)
    {
    }
  
    //非泛型方法
   public T getMiddle(){return middle;}  
    
   private T middle;    
   public T length;   //length要用public或者默認(rèn)訪問(wèn)修飾符  
}  

3.3泛型返回類型的泛型方法

class ArrayAlg  
{  
     public static <T> Pair<T> getMiddle(T[] b)  //這里的泛型方法返回類型為Pair<String>  
     {  
         return new Pair<T>(b[b.length / 2]);  //b[b.length / 2]是T[]類型,所以無(wú)需強(qiáng)制類型轉(zhuǎn)換寨辩。  
     }  
}  

調(diào)用如下String[] names = { "mmj", "geeeeg.", "sa" };
Pair<String> middle = ArrayAlg.<String>getMiddle(names);
//如前所述Pair<String> middle = ArrayAlg.getMiddle(names);也可以吓懈。
參考:
1.http://blog.csdn.net/zzy7075/article/details/50467089##3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市靡狞,隨后出現(xiàn)的幾起案子耻警,更是在濱河造成了極大的恐慌,老刑警劉巖甸怕,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘穿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梢杭,警方通過(guò)查閱死者的電腦和手機(jī)温兼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)武契,“玉大人募判,你說(shuō)我怎么就攤上這事荡含。” “怎么了届垫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵释液,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我装处,道長(zhǎng)均澳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任符衔,我火速辦了婚禮找前,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘判族。我一直安慰自己躺盛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布形帮。 她就那樣靜靜地躺著槽惫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辩撑。 梳的紋絲不亂的頭發(fā)上界斜,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音合冀,去河邊找鬼各薇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛君躺,可吹牛的內(nèi)容都是我干的峭判。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棕叫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼林螃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俺泣,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疗认,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伏钠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體横漏,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年贝润,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绊茧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡打掘,死狀恐怖华畏,靈堂內(nèi)的尸體忽然破棺而出鹏秋,到底是詐尸還是另有隱情,我是刑警寧澤亡笑,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布侣夷,位于F島的核電站,受9級(jí)特大地震影響仑乌,放射性物質(zhì)發(fā)生泄漏百拓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一晰甚、第九天 我趴在偏房一處隱蔽的房頂上張望衙传。 院中可真熱鬧,春花似錦厕九、人聲如沸蓖捶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俊鱼。三九已至畅买,卻和暖如春并闲,著一層夾襖步出監(jiān)牢的瞬間谷羞,已是汗流浹背帝火。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工洒宝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留购公,地道東北人萌京。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓雁歌,卻偏偏與公主長(zhǎng)得像知残,于是被迫代替她去往敵國(guó)和親靠瞎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子求妹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 泛型的概念 泛型乏盐,本質(zhì)是參數(shù)化類型,這個(gè)概念在程序設(shè)計(jì)里面很經(jīng)持苹校可以看到父能,泛型的使用很靈活而且高效,它允許程序員將...
    MarcoHorse閱讀 250評(píng)論 0 0
  • 引言:泛型一直是困擾自己的一個(gè)難題何吝,但是泛型有時(shí)一個(gè)面試時(shí)老生常談的問(wèn)題;今天作者就通過(guò)查閱相關(guān)資料簡(jiǎn)單談?wù)勛约簩?duì)...
    cp_insist閱讀 1,838評(píng)論 0 4
  • Why ——引入泛型機(jī)制的原因 假如我們想要實(shí)現(xiàn)一個(gè)String數(shù)組爱榕,并且要求它可以動(dòng)態(tài)改變大小,這時(shí)我們都會(huì)想到...
    absfree閱讀 5,099評(píng)論 1 6
  • 泛型是Java 1.5引入的新特性藻三。泛型的本質(zhì)是參數(shù)化類型,這種參數(shù)類型可以用在類跪者、變量、接口和方法的創(chuàng)建中渣玲,分別...
    何時(shí)不晚閱讀 3,028評(píng)論 0 2
  • 時(shí)間:2015.11.27 21:30-22:10進(jìn)度:整套申論模擬試題書(shū)摘:1.“萬(wàn)能八條”內(nèi)容:一、領(lǐng)導(dǎo)重視仗谆、...
    MissBao88閱讀 80評(píng)論 0 0