Java泛型<T> T與T的使用方法詳解
泛型(Generic type 或者 generics)是對 Java 語言的類型系統(tǒng)的一種擴(kuò)展,以支持創(chuàng)建可以按類型進(jìn)行參數(shù)化的類??梢园杨愋蛥?shù)看作是使用參數(shù)化類型時指定的類型的一個占位符,就像方法的形式參數(shù)是運(yùn)行時傳遞的值的占位符一樣。
在集合框架(Collection framework)中泛型的身影隨處可見。例如,Map 類允許向一個 Map 類型的實例添加任意類的對象,即使最常見的情況在給定映射(map)中保存一個string鍵值對。
命名類型參數(shù)
對于常見的泛型模式,推薦的泛型類型變量:
- E:元素(Element),多用于java集合框架
- K:關(guān)鍵字(Key)
- N:數(shù)字(Number)
- T:類型(Type)
- V:值(Value)
大家都知道,Java的泛型是偽泛型,這是因為Java在編譯期間,所有的泛型信息都會被擦除,正確理解泛型概念的首要前提是理解類型擦除。Java 泛型是如何工作的?什么是類型擦除?答:泛型是通過類型擦除來實現(xiàn)的,編譯器在編譯時擦除了所有泛型類型相關(guān)的信息,所以在運(yùn)行時不存在任何泛型類型相關(guān)的信息,譬如 List<Integer> 在運(yùn)行時僅用一個 List 來表示,這樣做的動機(jī)是兼容 Java 1.5 之前版本。
泛型擦除具體來說就是在編譯成字節(jié)碼時首先進(jìn)行類型檢查,然后進(jìn)行類型擦除(即所有類型參數(shù)都用他們的限定類型替換,包括類、變量和方法),最后如果類型擦除和多態(tài)性發(fā)生沖突,就在子類中使用橋接方法解決;如果調(diào)用泛型方法的返回類型被擦除,則在調(diào)用該方法時插入強(qiáng)制類型轉(zhuǎn)換。在類型擦除中,編譯器確保不會創(chuàng)建額外的類,并且沒有運(yùn)行時開銷。
類型擦除原則
- 用通用類型的類型參數(shù)替換其綁定的有界類型參數(shù);
- 如果使用無界類型參數(shù),則使用Object替換類型參數(shù);
- 插入類型轉(zhuǎn)換以實現(xiàn)類型安全;
- 生成橋接方法以在擴(kuò)展通用類型中保持多態(tài)。
<T> T 和T的區(qū)別:T是Type的首字母縮寫;<T> T 表示“返回值”是一個泛型,傳入什么類型,就返回什么類型;而單獨的“T”表示限制傳入的參數(shù)類型。
<T> T 的用法
這個<T> T 表示返回值T的類型是泛型,T是一個占位符,用來告訴編譯器,這個東西是先給我留著, 等我編譯的時候再告訴你是什么類型。
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);
}
/**
* 這個<T> T 可以傳入任何類型的List
* 關(guān)于參數(shù)T
* 第一個 表示是泛型
* 第二個 表示返回的是T類型的數(shù)據(jù)
* 第三個 限制參數(shù)類型為T
*
* @param data
* @return
*/
private <T> T getListFisrt(List<T> data) {
if (CollectionUtils.isEmpty(data)) {
return null;
}
return data.get(0);
}
}
T 的用法
單獨的T表示限制參數(shù)的類型。這種用法一般多用于共同操作一個類對象,然后獲取里面的集合信息。
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);
}
/**
* 這個只能傳遞T類型的數(shù)據(jù)
* 返回值 就是Demo<T> 實例化傳遞的對象類型
*
* @param data
* @return
*/
private T getListFisrt(List<T> data) {
if (data == null || data.size() == 0) {
return null;
}
return data.get(0);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)
玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
SpringMVC如何獲取多種類型數(shù)據(jù)響應(yīng)
這篇文章主要介紹了SpringMVC如何獲取多種類型數(shù)據(jù)響應(yīng),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11
Mybatis如何根據(jù)List批量查詢List結(jié)果
這篇文章主要介紹了Mybatis如何根據(jù)List批量查詢List結(jié)果,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

