Java 泛型全解析
泛型簡介
什么是泛型?
- 參化類型,數(shù)是JDK1.5的新特性。(定義泛型時使用參數(shù)可以簡單理解為形參),例如List<E>,Map<K,V>
- 編譯時的一種類型,此類型僅僅在編譯階段有效,運(yùn)行時無效.例如List<String>在運(yùn)行時String會被擦除,最終系統(tǒng)會認(rèn)為都是Object.
為什么要使用泛型?
泛型是進(jìn)行類型設(shè)計或方法定義時的一種約束規(guī)范,基于此規(guī)范可以:
- 提高編程時靈活性(有點(diǎn)抽象,后續(xù)結(jié)合實例理解)。
- 提高程序運(yùn)行時的性能。(在編譯階段解決一些運(yùn)行時需要關(guān)注的問題,例如強(qiáng)轉(zhuǎn))
說明:泛型應(yīng)用相對比較簡單,難點(diǎn)在泛型類或方法的設(shè)計上,通過這樣的設(shè)計如何對現(xiàn)有類進(jìn)行減法設(shè)計,提高類或方法的通用性.
泛型應(yīng)用類型
泛型定義時常用方式有三種(可參考List<E>,Map<K,V)等接口定義):
- 泛型類:class 類名<泛型,…>{}
- 泛型接口:interface 接口名<泛型,…>{}
- 泛型方法: <泛型> 方法返回值類型 方法名(形參){}
泛型類定義及應(yīng)用
類泛型定義:(用于約束類中方法參數(shù)和方法返回值類型)
class Array<T>{//類泛型:類名<泛型>
Object[] array=new Object[10];
public void add(T t){}//通過類泛型約束方法參數(shù)類型
public T get(int i){//通過類泛型約束方法返回值類型
return (T)array[i];
}
}
泛型接口定義及應(yīng)用
定義接口時指定泛型,用于約束接口方法參數(shù)類型以及方法返回值類
interface Task<Param,Result>{//思考map中的泛型Map<K,V>
/**
* 此方法用于執(zhí)行任務(wù)
* @param arg 其類型由泛型參數(shù)Param決定
* @return 其類型由泛型參數(shù)result決定
*/
Result execute(Param arg);
}
泛型接口應(yīng)用實踐
class ConvertTask implements Task<String,Integer>{
@Override
public Integer execute(String arg) {
// TODO Auto-generated method stub
return Integer.parseInt(arg);
}
}
泛型定義及應(yīng)用
泛型方法中的泛型僅僅應(yīng)用于當(dāng)前方法,主要應(yīng)用于一些靜態(tài)方法,當(dāng)然非靜態(tài)方法也可以應(yīng)用。
class ObjectFactory{
/**泛型方法*/
public static <T>T newInstance(Class<T> cls){
return (T)cls.newInstance();
}
}
泛型應(yīng)用通配符應(yīng)用
無界限定通配符
泛型無界通配符使用”?”進(jìn)行表示,可以代表一種任意參數(shù)類型(實參類型)。一般應(yīng)用于變量的定義。例如:Class<?> c1;
Class<?> c=Class.forName("java.util.Date");
上屆界限定通配符
泛型上屆限定符通過“<? extends 類型>”方式進(jìn)行實現(xiàn),主要用于方法參數(shù)或方法的返回值類型,例如:
static void doPrint(List<? extends CharSequence> list){
System.out.println(list);
}
下屆限定通配符
泛型下屆限定符通過“<? super 類型>”方式進(jìn)行實現(xiàn),主要用于方法參數(shù)或方法的返回值類型,例如:
static void doPrint(Set<? super Integer> set){
System.out.println(list);
}
泛型類型擦除實踐分析
泛型是編譯時的一種類型,在運(yùn)行時無效,運(yùn)行時候都會變成Object類型,例如:
ArrayList<String> list = new ArrayList<String>();
list.add("A");
//list.add(100);//直接不可以
//通過反射將100添加到集合
list.getClass().getMethod("add", Object.class).invoke(list, 100);
System.out.println(list);
總結(jié)(Summary)
本小節(jié)對泛型的定義,應(yīng)用場景,應(yīng)用類型以及泛型的類型擦出進(jìn)行了分析和實踐,希望在后續(xù)項目實踐中對泛型有一個更好的認(rèn)識。
以上就是Java 泛型全解析的詳細(xì)內(nèi)容,更多關(guān)于Java 泛型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Mybatis與druid實現(xiàn)流程詳解
這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的下伙伴可以參考一下2022-10-10
SpringBoot實現(xiàn)熱部署的方式總結(jié)
所謂熱部署,就是在應(yīng)用正在運(yùn)行的時候升級軟件,卻不需要重新啟動應(yīng)用,對于Java來說,熱部署就是在運(yùn)行時更新Java類文件,本文將深入探討SpringBoot有哪些方式可以實現(xiàn)熱部署,感興趣的朋友可以小編一探討學(xué)習(xí)2023-06-06
SpringBoot+Redis使用AOP防止重復(fù)提交的實現(xiàn)
本文主要介紹了SpringBoot+Redis使用AOP防止重復(fù)提交的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java利用Netty時間輪實現(xiàn)延時任務(wù)
時間輪是一種可以執(zhí)行定時任務(wù)的數(shù)據(jù)結(jié)構(gòu)和算法。本文將為大家詳細(xì)講解一下Java如何利用Netty時間輪算法實現(xiàn)延時任務(wù),感興趣的小伙伴可以了解一下2022-08-08
Spring Boot項目中結(jié)合MyBatis實現(xiàn)MySQL的自動主從切換功能
這篇文章主要介紹了Spring Boot項目中結(jié)合MyBatis實現(xiàn)MySQL的自動主從切換功能,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04

