泛型瑣碎之泛型方法

泛型

泛型:是一種把類型明確的工作推遲到創(chuàng)建對象或者調(diào)用方法的時候才去明確的特殊的類型。把類型當作參數(shù)傳遞多矮。

格式:<數(shù)據(jù)類型> 此處的數(shù)據(jù)類型只能是引用類型, 如<E>, 丟進去的類型必須是E的對象或其子類的對象迷郑。

好處:
A:把運行時期的問題提前到了編譯期間
B:避免了強制類型轉(zhuǎn)換
C:優(yōu)化了程序設(shè)計,解決了黃色警告線

泛型方法

such as, ResponseEntity類帶有一個E類型形參

public class ResponseEntity<E> {
    private String msg;
    private String code; 
    private E data;
    
    public ResponseEntity(String code, String msg, E data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    
    /*
    方法靜態(tài)時,不能訪問類定義上的泛型
    */
    public static <E> ResponseEntity<E> success(String code, String msg, E data) {
    // 傳入什么類型默穴,E就是什么類型 
        return new ResponseEntity<E>(code, msg, data);
    }
} 

現(xiàn)在假設(shè)有一個

Apple a = new Apple();
// 調(diào)用success()方法, 
ResponseEntity.success("200", "ok", a);
//這樣success()方法的返回值類型 ResponseEntity<E>中的E代表Apple類型褪秀。

再比如:

public static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o);
    }
}

這是一個泛型方法蓄诽,該泛型方法定義一個T類型形參,這樣方法就能接受任意類型的參數(shù)了媒吗。

Integer[] ia = new Integer[100];
Collection<Number>  cn = new ArrayList<>();
// T代表Number類型
// 只比較泛型形參: Collection<T> cn
fromArrayToCollection(ia, cn);

cn是Collection<Number>類型仑氛,與此方法的方法簽名進行比較——只比較泛型參數(shù),故該T類型形參代表了Number類型。

public static <T> void test(Collection<? extends T> from, Collection<T> to) {
    for (T ele : from) {
        to.add(ele);
    }
}

//String Object
List<Object> ao = new ArrayList<>();
List<String> as = new ArrayList<>();
// T代表Object類型锯岖, as中的String是Object的子類類型
test(as, ao);

泛型方法和類型通配符(?)

大多時候介袜,可以使用泛型方法來代替類型通配符。如Java的Collection接口中的兩個方法:

// 泛型通配符
public interface Collection<E> {
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
}

//采用泛型方法的形式
public interface Collection<E> {
    <T> boolean containsAll(Collection<T> c);
    <T extends E> boolean addAll(Collection<T> c);
}

上面兩個方法中類型形參T只使用了一次出吹,類型形參T產(chǎn)生的唯一效果是可以在不同的調(diào)用點傳入不同的實際類型遇伞。對于這種情況,應(yīng)該使用通配符:通配符就是被設(shè)計用來支持靈活的子類化的捶牢。

泛型方法允許類型形參被用來表示方法的一個或多個參數(shù)之間的類型依賴關(guān)系鸠珠,或者方法返回值與參數(shù)之間的類型依賴關(guān)系。如果沒有這種依賴關(guān)系秋麸,就不應(yīng)該使用泛型方法渐排。

再來看一個栗子, Collections.copy()方法:

public class Collections {
    public static <T> void copy(List<T> dest, List<? extends T> src){...}
}
/*
src中 ? 代表的類型須是dest中 T 的子類或它本身
dest于src的類型存在明顯的依賴關(guān)系
但JDK定義src時使用的是類型通配符,而不是泛型方法
Reason: 該方法無須向src集合中添加元素灸蟆,也無須修改src集合里的元素驯耻,使用類型通配符,無須使用泛型方法
*/

如果改成泛型方法炒考,不使用類型通配符:

class Collections {
    public static <T, S extends T> void copy(List<T> dest, 
    List<S> src) {...}
}
/*
這里的類型形參S, 它使用了一次, 其他參數(shù)的類型可缚、方法返回值的類型都不依賴于它,
那類型形參S就沒有存在的必要票腰,即可以用通配符來代替S城看。so Java 設(shè)計該方法時采用了通配符,而不是泛型方法杏慰。
*/

類型通配符既可以在方法簽名中定義形參的類型测柠,也可以用于定義變量的類型;但泛型方法中的類型形參必須在對應(yīng)方法中顯式聲明缘滥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轰胁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朝扼,更是在濱河造成了極大的恐慌赃阀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎颖,死亡現(xiàn)場離奇詭異榛斯,居然都是意外死亡,警方通過查閱死者的電腦和手機搂捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門驮俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人允跑,你說我怎么就攤上這事王凑√赂蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵索烹,是天一觀的道長工碾。 經(jīng)常有香客問我,道長百姓,這世上最難降的妖魔是什么渊额? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮垒拢,結(jié)果婚禮上端圈,老公的妹妹穿的比我還像新娘。我一直安慰自己子库,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布矗晃。 她就那樣靜靜地躺著仑嗅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪张症。 梳的紋絲不亂的頭發(fā)上仓技,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音俗他,去河邊找鬼脖捻。 笑死,一個胖子當著我的面吹牛兆衅,可吹牛的內(nèi)容都是我干的地沮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼羡亩,長吁一口氣:“原來是場噩夢啊……” “哼摩疑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畏铆,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷袋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辞居,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楷怒,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年瓦灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸠删。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡倚搬,死狀恐怖冶共,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤捅僵,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布家卖,位于F島的核電站,受9級特大地震影響庙楚,放射性物質(zhì)發(fā)生泄漏上荡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一馒闷、第九天 我趴在偏房一處隱蔽的房頂上張望酪捡。 院中可真熱鬧,春花似錦纳账、人聲如沸逛薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永罚。三九已至,卻和暖如春卧秘,著一層夾襖步出監(jiān)牢的瞬間呢袱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工翅敌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞福,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蚯涮,卻偏偏與公主長得像治专,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恋昼,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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

  • object 變量可指向任何類的實例看靠,這讓你能夠創(chuàng)建可對任何數(shù)據(jù)類型進程處理的類。然而液肌,這種方法存在幾個嚴重的問題...
    CarlDonitz閱讀 913評論 0 5
  • 開發(fā)人員在使用泛型的時候挟炬,很容易根據(jù)自己的直覺而犯一些錯誤。比如一個方法如果接收List作為形式參數(shù)嗦哆,那么如果嘗試...
    時待吾閱讀 1,055評論 0 3
  • 一谤祖、泛型簡介1.引入泛型的目的 了解引入泛型的動機,就先從語法糖開始了解老速。 語法糖 語法糖(Syntactic S...
    Android進階與總結(jié)閱讀 1,029評論 0 9
  • 一粥喜、泛型的概念 泛型就是:類型參數(shù)化,處理的數(shù)據(jù)類型不是固定的橘券,而是可以作為參數(shù)傳入额湘;瘋狂講義定義:泛型就是允許在...
    Serenity那年閱讀 705評論 2 0
  • 我以前不是這樣的 一首歌我最多聽五十次 我就膩到連前奏響起我都特別厭惡 我以前不是這樣的 我對一個人的好感不超過三...
    EPARGNer閱讀 227評論 1 0