溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于Java泛型<T> T與T的簡介

發(fā)布時(shí)間:2020-07-02 14:44:20 來源:億速云 閱讀:413 作者:清晨 欄目:開發(fā)技術(shù)

這篇文章主要介紹關(guān)于Java泛型<T> T與T的簡介,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

泛型(Generic type 或者 generics)是對 Java 語言的類型系統(tǒng)的一種擴(kuò)展,以支持創(chuàng)建可以按類型進(jìn)行參數(shù)化的類??梢园杨愋蛥?shù)看作是使用參數(shù)化類型時(shí)指定的類型的一個(gè)占位符,就像方法的形式參數(shù)是運(yùn)行時(shí)傳遞的值的占位符一樣。
在集合框架(Collection framework)中泛型的身影隨處可見。例如,Map 類允許向一個(gè) Map 類型的實(shí)例添加任意類的對象,即使最常見的情況在給定映射(map)中保存一個(gè)string鍵值對。

命名類型參數(shù)

對于常見的泛型模式,推薦的泛型類型變量:

  • E:元素(Element),多用于java集合框架
  • K:關(guān)鍵字(Key)
  • N:數(shù)字(Number)
  • T:類型(Type)
  • V:值(Value)
     

大家都知道,Java的泛型是偽泛型,這是因?yàn)镴ava在編譯期間,所有的泛型信息都會(huì)被擦除,正確理解泛型概念的首要前提是理解類型擦除。Java 泛型是如何工作的?什么是類型擦除?答:泛型是通過類型擦除來實(shí)現(xiàn)的,編譯器在編譯時(shí)擦除了所有泛型類型相關(guān)的信息,所以在運(yùn)行時(shí)不存在任何泛型類型相關(guān)的信息,譬如 List<Integer> 在運(yùn)行時(shí)僅用一個(gè) List 來表示,這樣做的動(dòng)機(jī)是兼容 Java 1.5 之前版本。

泛型擦除具體來說就是在編譯成字節(jié)碼時(shí)首先進(jìn)行類型檢查,然后進(jìn)行類型擦除(即所有類型參數(shù)都用他們的限定類型替換,包括類、變量和方法),最后如果類型擦除和多態(tài)性發(fā)生沖突,就在子類中使用橋接方法解決;如果調(diào)用泛型方法的返回類型被擦除,則在調(diào)用該方法時(shí)插入強(qiáng)制類型轉(zhuǎn)換。在類型擦除中,編譯器確保不會(huì)創(chuàng)建額外的類,并且沒有運(yùn)行時(shí)開銷。

類型擦除原則

  • 用通用類型的類型參數(shù)替換其綁定的有界類型參數(shù);
  • 如果使用無界類型參數(shù),則使用Object替換類型參數(shù);
  • 插入類型轉(zhuǎn)換以實(shí)現(xiàn)類型安全;
  • 生成橋接方法以在擴(kuò)展通用類型中保持多態(tài)。
     

<T> T 和T的區(qū)別:T是Type的首字母縮寫;<T> T 表示“返回值”是一個(gè)泛型,傳入什么類型,就返回什么類型;而單獨(dú)的“T”表示限制傳入的參數(shù)類型。

<T> T 的用法

這個(gè)<T> T 表示返回值T的類型是泛型,T是一個(gè)占位符,用來告訴編譯器,這個(gè)東西是先給我留著, 等我編譯的時(shí)候再告訴你是什么類型。

import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
public class Demo {
  public static void main(String[] args) {
    Demo demo = new Demo();
    //獲取string類型
    List<String> array = new ArrayList<String>();
    array.add("test");
    array.add("doub");
    String str = demo.getListFisrt(array);
    System.out.println(str);
    //獲取Integer類型
    List<Integer> nums = new ArrayList<Integer>();
    nums.add(31);
    nums.add(32);
    Integer num = demo.getListFisrt(nums);
    System.out.println(num);
  }

  /**
   * 這個(gè)<T> T 可以傳入任何類型的List
   * 關(guān)于參數(shù)T
   * 第一個(gè) 表示是泛型
   * 第二個(gè) 表示返回的是T類型的數(shù)據(jù)
   * 第三個(gè) 限制參數(shù)類型為T
   *
   * @param data
   * @return
   */
  private <T> T getListFisrt(List<T> data) {
    if (CollectionUtils.isEmpty(data)) {
      return null;
    }
    return data.get(0);
  }
}

T 的用法

單獨(dú)的T表示限制參數(shù)的類型。這種用法一般多用于共同操作一個(gè)類對象,然后獲取里面的集合信息。

import java.util.ArrayList;
import java.util.List;

public class Demo2<T> {

  public static void main(String[] args) {
    //限制T 為String 類型
    Demo2<String> demo = new Demo2<String>();
    List<String> array = new ArrayList<String>();
    array.add("Tom");
    array.add("河南");
    String str = demo.getListFisrt(array);
    System.out.println(str);

    //獲取Integer類型
    Demo2<Integer> demo2 = new Demo2<Integer>();
    List<Integer> nums = new ArrayList<Integer>();
    nums.add(12);
    nums.add(13);
    Integer num = demo2.getListFisrt(nums);
    System.out.println(num);
  }

  /**
   * 這個(gè)只能傳遞T類型的數(shù)據(jù)
   * 返回值 就是Demo<T> 實(shí)例化傳遞的對象類型
   *
   * @param data
   * @return
   */
  private T getListFisrt(List<T> data) {
    if (data == null || data.size() == 0) {
      return null;
    }
    return data.get(0);
  }
}

以上是關(guān)于Java泛型<T> T與T的簡介的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI