博客

Java泛型簡單的使用

Github:https://github.com/imyiren/java-base-ilss

前言

Java里面的泛型在實際開發(fā)中運用的很多谓形,學(xué)過C++的同學(xué)一定知道C++的模板汹来,而Java中的泛型笋颤,一定程度上和它還是挺像的直秆。


相信寫Java的人瞄崇,大都有用過List的實現(xiàn)類ArrayList昂勒。在Java沒有泛型之前闸翅,它的內(nèi)部是一個Object的數(shù)組實現(xiàn)的。這也導(dǎo)致一個問題辜伟,每次使用里面的元素的時候需要向下轉(zhuǎn)型氓侧,而且很明顯脊另,如果是Object的話,意味著我們可以丟任何對象進(jìn)去约巷。自動轉(zhuǎn)型成Object偎痛,這樣在使用的時候就很容易出問題,不知道里面存的是什么独郎。如:


ArrayList list = new ArrayList();

list.add("string1");

list.add("string2");

String str = (String) list.get(0);

list.add(new File("test.txt"));

然而使用泛型容易踩麦,我們就經(jīng)常使用List的泛型,但是如果我們要寫一個泛型的類其實并不那么容易氓癌。


最簡單的泛型

package io.ilss.advanced.generic;


/**

* className MyObject

* description MyObject

*

* @author feng

* @version 1.0

* @date 2019-01-24 18:32

*/

public class MyObject<T> extends BaseData {

? ? private T valueOne;

? ? private T valueTwo;


? ? public MyObject(T valueOne, T valueTwo) {

? ? ? ? this.valueOne = valueOne;

? ? ? ? this.valueTwo = valueTwo;

? ? }


? ? public T getValueOne() {

? ? ? ? return valueOne;

? ? }


? ? public void setValueOne(T valueOne) {

? ? ? ? this.valueOne = valueOne;

? ? }


? ? public T getValueTwo() {

? ? ? ? return valueTwo;

? ? }


? ? public void setValueTwo(T valueTwo) {

? ? ? ? this.valueTwo = valueTwo;

? ? }


? ? public static void main(String[] args) {

? ? ? ? MyObject<String> object = new MyObject<>("String one!", "String two");

? ? ? ? System.out.println("value one " + object.valueOne + " value two " + object.valueTwo);

? ? }

}

在MyObject中引入一個類型變量T谓谦,用尖括號<>括起來,放在類名的后面贪婉。如上反粥!在定義的時候可以有多個類型的變量,在<>中以逗號,分隔例如public class MyObject<T, U>{…},在類中如果要使用類型 就直接把定義的類型變量看做類名使用即可。

用泛型做一個接口返回類

相信寫Java的程序員都寫過Web接口,那我們用泛型來封裝一個統(tǒng)一響應(yīng)返回的類ResponseMsg返奉。

package io.ilss.advanced.generic;


/**

* className ResponseMsg

* description ResponseMsg

*

* @author feng

* @version 1.0

* @date 2019-01-24 18:47

*/

public class ResponseMsg<T extends BaseData> {

? ? public static int SUCCESS_CODE = 1;

? ? public static int ERROR_CODE = 0;

? ? public static int OTHER_CODE = -1;

? ? private int code;

? ? private String msg;

? ? private T data;


? ? public static <U extends BaseData> ResponseMsg sendSuccess(U data) {

? ? ? ? ResponseMsg<U> responseMsg = new ResponseMsg<>();

? ? ? ? responseMsg.code = SUCCESS_CODE;

? ? ? ? responseMsg.data = data;

? ? ? ? responseMsg.msg = "Remote Call Success!";

? ? ? ? return responseMsg;

? ? }


? ? public static <U extends BaseData> ResponseMsg sendError(U data, String msg) {

? ? ? ? ResponseMsg<U> responseMsg = new ResponseMsg<>();

? ? ? ? responseMsg.code = ERROR_CODE;

? ? ? ? responseMsg.data = data;

? ? ? ? responseMsg.msg = "Remote Call Error";

? ? ? ? return responseMsg;

? ? }

? ? public static <U extends BaseData> ResponseMsg sendOther(U data, String msg) {

? ? ? ? ResponseMsg<U> responseMsg = new ResponseMsg<>();

? ? ? ? responseMsg.code = OTHER_CODE;

? ? ? ? responseMsg.data = data;

? ? ? ? responseMsg.msg = msg;

? ? ? ? return responseMsg;

? ? }


? ? public static void main(String[] args) {

? ? ? ? System.out.println(ResponseMsg.<MyObject>sendSuccess(new MyObject<String>("asdf","asfd")));

? ? }


? ? @Override

? ? public String toString() {

? ? ? ? return "ResponseMsg{" +

? ? ? ? ? ? ? ? "code=" + code +

? ? ? ? ? ? ? ? ", msg='" + msg + '\'' +

? ? ? ? ? ? ? ? ", data=" + data +

? ? ? ? ? ? ? ? '}';

? ? }

}


上面的重點是上的<U>我利用靜態(tài)方法封裝了ResponseMsg的構(gòu)建,只需要提供靜態(tài)方法讓調(diào)用的人傳入一個類娜膘,也可以不用寫Getter Setter方法,或者直接變成私有方法。

方法如果要用泛型优质,則只需要在定時的時候在返回類型前面加上<T>即可使用竣贪。調(diào)用的時候直接在調(diào)用方法前面用<>傳入你想用的類即可。如上所示巩螃,也可以將方法用的泛型直接傳入自己類定義的泛型演怎。

此外還可以通過extends限定你是某某類的子類,或者實現(xiàn)了某個接口避乏。如果有多個接口可以用&連接爷耀,比如<T extends Comparable & Serializable>,如果有多個泛型可以是這樣<T extends OneObject, U extends TwoObject>

注意

泛型不能直接new拍皮,需要外部傳入歹叮。


如:


T data = new T();? ? //這是不被允許的,不能實例化對象

T[] arr = new T[10];? //這也是不被允許的? 不能構(gòu)造泛型數(shù)組

JAVA

相關(guān)推薦

我的編程能力是怎樣突飛猛進(jìn)的

閱讀 13150

面試官問我:Object o = new Object() 占用了多少個字節(jié)铆帽?

閱讀 7936

活久見咆耿,大佬4面字節(jié)暢通無阻直接拿offer,附上大佬的面試感悟爹橱!

閱讀 237

今年我讀了四個開源項目的源碼萨螺,來分享下心得

閱讀 34124

新來的小哥這樣寫代碼!同事直呼“中毒了”

閱讀 4094

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慰技,隨后出現(xiàn)的幾起案子椭盏,更是在濱河造成了極大的恐慌,老刑警劉巖吻商,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏颊,死亡現(xiàn)場離奇詭異,居然都是意外死亡艾帐,警方通過查閱死者的電腦和手機(jī)蚯舱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掩蛤,“玉大人,你說我怎么就攤上這事陈肛∽崮瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵句旱,是天一觀的道長阳藻。 經(jīng)常有香客問我,道長谈撒,這世上最難降的妖魔是什么腥泥? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮啃匿,結(jié)果婚禮上蛔外,老公的妹妹穿的比我還像新娘。我一直安慰自己溯乒,他們只是感情好夹厌,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裆悄,像睡著了一般矛纹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上光稼,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天或南,我揣著相機(jī)與錄音,去河邊找鬼艾君。 笑死采够,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冰垄。 我是一名探鬼主播吁恍,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冀瓦?” 一聲冷哼從身側(cè)響起伴奥,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翼闽,沒想到半個月后拾徙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡感局,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年尼啡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片询微。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡崖瞭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撑毛,到底是詐尸還是另有隱情书聚,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布藻雌,位于F島的核電站雌续,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胯杭。R本人自食惡果不足惜驯杜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望做个。 院中可真熱鬧鸽心,春花似錦、人聲如沸居暖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝但。三九已至冲九,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跟束,已是汗流浹背莺奸。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留冀宴,地道東北人灭贷。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像略贮,于是被迫代替她去往敵國和親甚疟。 傳聞我的和親對象是個殘疾皇子仗岖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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