Java泛型食用筆記(一) -- 基本介紹

Java泛型食用筆記(一) -- 基本介紹


JDK5 將泛型引入,這是 Java 走向類型安全的一大步,然而黎炉,在學(xué)習(xí)和使用泛型的過(guò)程中,幾乎都會(huì)遇到令人沮喪的問(wèn)題嗽交。本系列試圖將 Java 的泛型解釋清楚卿嘲,幫助開(kāi)發(fā)者在開(kāi)發(fā)中正確的使用泛型。

1. 沒(méi)有泛型的糟糕世界

引入泛型的原因不少轮纫,其中一個(gè)重要原因就是為了容器類的優(yōu)雅實(shí)現(xiàn)腔寡。

在沒(méi)有泛型前,當(dāng)需要實(shí)現(xiàn)一個(gè)可以存儲(chǔ)任何類型對(duì)象的 Hashtable 時(shí)掌唾,會(huì)定義如下接口:

public class Hashtable {
...
    public Object put(Object key, Object value) {...}
    public Object get(Object key) {...}
...
}

當(dāng)你向 Hashtable 中插入對(duì)象時(shí)放前,比如一個(gè) String 對(duì)象,Hashtable 會(huì)把類型信息抹去糯彬,退化成 Object 對(duì)象進(jìn)行存儲(chǔ)凭语。此時(shí)只有你的腦袋中存有類型信息,當(dāng)你需要從 Hashtable 獲取元素時(shí)撩扒,必須對(duì)其進(jìn)行強(qiáng)制類型轉(zhuǎn)換才能獲得你所需的 String 對(duì)象似扔。

...
    Hashtable h = new Hashtable();
    h.put("string", "value");
    String s = (String)h.get("string");
...

這樣的代碼直覺(jué)上就不太讓人放心。每次強(qiáng)制類型轉(zhuǎn)換搓谆,不僅增加冗余的代碼炒辉,同時(shí)也是一次忽略編譯器進(jìn)行靜態(tài)類型檢查的過(guò)程,如果轉(zhuǎn)換過(guò)程中出現(xiàn)錯(cuò)誤泉手,就會(huì)拋出 ClassCastException 異常黔寇,除非你能確保轉(zhuǎn)換無(wú)誤,否則你需要更過(guò)的代碼來(lái)進(jìn)行錯(cuò)誤處理斩萌。在泛型出來(lái)之前缝裤,這幾乎是無(wú)解題。

2. 泛型的引入

Java 泛型的核心就是告訴編譯器想使用什么類型颊郎,然后編譯器幫你處理一切細(xì)節(jié)憋飞。泛型也是一種參數(shù),只不過(guò)參數(shù)傳入的是類型姆吭。引入泛型可以讓一些實(shí)現(xiàn)更優(yōu)雅榛做。

使用泛型重新定義 Hashtable 及其接口:

public class Hashtable<K, V> {
...
    public V put(K key, V value) {...}
    public V get(K key) {...}
...
}

其中 <K, V> 即為類型參數(shù),其作用域?yàn)轭惗x的主體部分(除靜態(tài)成員)猾编。當(dāng)使用泛型類時(shí)瘤睹,你要將你所需使用的類型傳入。

...
    Hashtable<String, String> h = new Hashtable<>();
    h.put("string", "value");
    String s = h.get("string");
...

使用泛型后的 Hashtable 類更加簡(jiǎn)潔答倡。我們來(lái)看下泛型帶來(lái)了什么:

  • 將類型信息告訴編譯器
  • 放入元素時(shí)編譯器進(jìn)行類型檢查
  • 取出元素自動(dòng)轉(zhuǎn)換類型

編譯器在編譯期間就會(huì)進(jìn)行類型檢查轰传,防止在運(yùn)行期間出現(xiàn)類型錯(cuò)誤。

3. 泛型接口

泛型也可用于接口瘪撇,比如需要寫(xiě)一個(gè)生成器:

interface Gernerator<T> {
    T next();
}

class DrinkGernerator implements Gernerator<Drink> {
    private Drink[] drinks = {new Water(){}, new Coke(){}, new Coffee(){}};
    private Random seed = new Random();

    @Override
    public Drink next() {
        return drinks[seed.nextInt(3)];
    }
}

abstract class Drink {
    public abstract String name();
}

class Water extends Drink {
    @Override
    public String name() {
        return "Water";
    }
}

class Coke extends Drink {
    @Override
    public String name() {
        return "Coke";
    }
}

class Coffee extends Drink {
    @Override
    public String name() {
        return "Coffee";
    }
}

看上去是不是特別眼熟获茬,容器的迭代器 Iterator<E> 就是一個(gè)典型的生成器接口港庄。

4. 泛型方法

之前據(jù)的所有例子都是作用與整個(gè)類的,泛型也可以僅僅應(yīng)用在方法上恕曲,也就是接下來(lái)要介紹的泛型方法鹏氧。原則上,能夠使用泛型方法的時(shí)候就盡量避免使用泛型類佩谣,這會(huì)使你的代碼看上去更加清楚把还。另外,如果 static 方法需要使用泛型茸俭,只能使用泛型方法吊履。

泛型方法的使用方法就是將泛型參數(shù)置于返回值之前:

public class GernericMethod {
    public static <T> void printClassName(T t) {
        System.out.println(t.getClass().getName());
    }

    public static void main(String[] args) {
        printClassName("string");
        printClassName(1);
        printClassName(2.1);
    }
}

output:

java.lang.String
java.lang.Integer
java.lang.Double

看上去 printClassName 方法就像無(wú)限重載過(guò),無(wú)論傳入什么類型的參數(shù)调鬓,都可以順利執(zhí)行艇炎。這是因?yàn)榉盒头椒ㄔ谑褂脮r(shí),編譯器會(huì)進(jìn)行參數(shù)推斷腾窝,幫助我們找到具體的類型缀踪。

小結(jié)

泛型可以用于泛型類,泛型接口虹脯,泛型方法驴娃,并都有各自的使用場(chǎng)景。引入泛型后循集,可以避免很多蹩腳的類型轉(zhuǎn)換等操作托慨,讓代碼實(shí)現(xiàn)更為優(yōu)雅,看上去一切都很美好暇榴。接下來(lái)我們將探討 Java 泛型的實(shí)現(xiàn)原理及帶來(lái)的問(wèn)題,以幫助我們更好的理解和使用 Java 泛型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕉世,一起剝皮案震驚了整個(gè)濱河市蔼紧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狠轻,老刑警劉巖奸例,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異向楼,居然都是意外死亡查吊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)湖蜕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逻卖,“玉大人,你說(shuō)我怎么就攤上這事昭抒∑酪玻” “怎么了炼杖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盗迟。 經(jīng)常有香客問(wèn)我坤邪,道長(zhǎng),這世上最難降的妖魔是什么罚缕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任艇纺,我火速辦了婚禮,結(jié)果婚禮上邮弹,老公的妹妹穿的比我還像新娘黔衡。我一直安慰自己,他們只是感情好肠鲫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布员帮。 她就那樣靜靜地躺著,像睡著了一般导饲。 火紅的嫁衣襯著肌膚如雪捞高。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天渣锦,我揣著相機(jī)與錄音硝岗,去河邊找鬼。 笑死袋毙,一個(gè)胖子當(dāng)著我的面吹牛型檀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播听盖,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胀溺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了皆看?” 一聲冷哼從身側(cè)響起仓坞,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腰吟,沒(méi)想到半個(gè)月后无埃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毛雇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年嫉称,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵疮。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡织阅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出震捣,到底是詐尸還是另有隱情蒲稳,我是刑警寧澤氮趋,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站江耀,受9級(jí)特大地震影響剩胁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祥国,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一昵观、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舌稀,春花似錦啊犬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至睡腿,卻和暖如春语御,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背席怪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工应闯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挂捻。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓碉纺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刻撒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骨田,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法声怔,內(nèi)部類的語(yǔ)法盛撑,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法捧搞,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 目錄 大概是飛機(jī)上十二個(gè)小時(shí)的祈禱起了作用,蘇錯(cuò)回家沒(méi)看到親娘狮荔。父親說(shuō)母親很難得地跟幾個(gè)朋友出門(mén)旅游去了胎撇。說(shuō)這話的...
    書(shū)咄咄閱讀 612評(píng)論 3 4
  • 換季啦~換季啦~衣柜里總?cè)奔路?( ?? )? 鞋架上總?cè)彪p鞋子( ?? ??? )噢~還缺口紅、蜜粉……缺各種...
    就叫yi顆小黃豆閱讀 357評(píng)論 3 1
  • 周一我們閱覽了有關(guān)稻盛先生的視頻,現(xiàn)場(chǎng)很多著名的當(dāng)代企業(yè)家也甚為膜拜這位神一般的老人雅采。每個(gè)人的成功爵憎,一定有...
    書(shū)_贏閱讀 439評(píng)論 0 1
  • 每日推薦: 每日一歌――薛之謙《王子公主》 每日一影――郭在容《我的早更女友》 每日一詩(shī)――白居易《暮江吟》 ...
    薩拉芯雪閱讀 206評(píng)論 0 0