Java源碼解析之TypeVariable詳解
TypeVariable,類(lèi)型變量,描述類(lèi)型,表示泛指任意或相關(guān)一類(lèi)類(lèi)型,也可以說(shuō)狹義上的泛型(泛指某一類(lèi)類(lèi)型),一般用大寫(xiě)字母作為變量,比如K、V、E等。
源碼
public interface TypeVariable<D extends GenericDeclaration> extends Type {
//獲得泛型的上限,若未明確聲明上邊界則默認(rèn)為Object
Type[] getBounds();
//獲取聲明該類(lèi)型變量實(shí)體(即獲得類(lèi)、方法或構(gòu)造器名)
D getGenericDeclaration();
//獲得名稱(chēng),即K、V、E之類(lèi)名稱(chēng)
String getName();
}
概述
說(shuō)到TypeVariable<D>就不得不提起java泛型中另一個(gè)比較重要的接口對(duì)象,GenericDeclaration接口對(duì)象。該接口用來(lái)定義哪些對(duì)象上是可以聲明(定義)范型變量,所謂范型變量就是<E extends List>或者<E>, 也就是TypeVariable<D>這個(gè)接口的對(duì)應(yīng)的對(duì)象,TypeVariable<D>中的D是extends GenericDeclaration的,用來(lái)通過(guò)范型變量反向獲取擁有這個(gè)變量的GenericDeclaration。
目前實(shí)現(xiàn)GenericDeclaration接口的類(lèi)包括Class, Method, Constructor,也就是說(shuō)只能在這幾種對(duì)象上進(jìn)行范型變量的聲明(定義)。GenericDeclaration的接口方法getTypeParameters用來(lái)逐個(gè)獲取該GenericDeclaration的范型變量聲明。詳情可查看:Java源碼解析之GenericDeclaration詳解
類(lèi)型變量的聲明(定義):<E>,前后需加上尖括號(hào)
//1.在類(lèi)(Class)上聲明(定義)類(lèi)型變量
class A<T>{
T a;
}//之后這里可用任意類(lèi)型替換T,例如
A<String> as = new A<String>();
//是否看著有點(diǎn)像集合?不錯(cuò),集合就是泛型的一個(gè)典型運(yùn)用
//2.在方法上聲明(定義)
public <E> void test(E e){}
//方法上,類(lèi)型變量聲明(定義)不是在參數(shù)里邊,而且必須在返回值之前,static等修飾后
//3.聲明(定義)在構(gòu)造器上
public <K> A(K k){}
【注意】類(lèi)型變量聲明(定義)的時(shí)候不能有下限(既不能有super),否則編譯報(bào)錯(cuò)。為什么?T extends classA表示泛型有上限classA,當(dāng)然可以,因?yàn)檫@樣,每一個(gè)傳進(jìn)來(lái)的類(lèi)型必定是classA(具有classA的一切屬性和方法),但若是T super classA,傳進(jìn)來(lái)的類(lèi)型不一定具有classA的屬性和方法,當(dāng)然就不適用于泛型,說(shuō)的具體點(diǎn):
//假設(shè)
class A<T super classA>{
T t;
public void test(){
//這個(gè)時(shí)候你不能用t干任何事,因?yàn)槟悴淮_定t具有哪些屬性和方法
//當(dāng)然,t肯定是有Object方法的,但沒(méi)意義
}
}
源碼詳解
1.getBounds
獲得該類(lèi)型變量的上限(上邊界),若無(wú)顯式定義(extends),默認(rèn)為Object,類(lèi)型變量的上限可能不止一個(gè),因?yàn)榭梢杂?amp;符號(hào)限定多個(gè)(這其中有且只能有一個(gè)為類(lèi)或抽象類(lèi),且必須放在extends后的第一個(gè),即若有多個(gè)上邊界,則第一個(gè)&后必為接口)。
class A<K extends classA & interfaceB, V>{
K key;
V value;
public static void main(String[] args) throws Exception
{
Type[] types = Main.class.getTypeParameters();
for(Type type : types){
TypeVariable t = (TypeVariable)type;
System.out.println(t.getGenericDeclaration());
int size = t.getBounds().length;
System.out.println(t.getBounds()[size - 1]);
System.out.println(t.getName() + "\n-------------分割線(xiàn)-------------");
}
}
}
//輸出結(jié)果
class com.fcc.test.Main
interface com.fcc.test.interfaceB
K
-------------分割線(xiàn)-------------
class com.fcc.test.Main
class java.lang.Object
V
-------------分割線(xiàn)-------------
2.getGenericDeclaration
獲得聲明(定義)這個(gè)類(lèi)型變量的類(lèi)型及名稱(chēng),即如:
class com.xxx.xxx.classA 或
public void com.fcc.test.Main.test(java.util.List) 或
public com.fcc.test.Main()
Constructor constructor = Main.class.getConstructor(); TypeVariable typeVariable = constructor.getTypeParameters()[0]; System.out.println(typeVariable.getGenericDeclaration()); //獲得方法中聲明(定義)的類(lèi)型變量與上面類(lèi)似
3.getName
獲得這個(gè)類(lèi)型變量在聲明(定義)時(shí)候的名稱(chēng)
總結(jié)
以上就是本文關(guān)于Java源碼解析之TypeVariable詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java源碼解析之object類(lèi)、java.lang.Void類(lèi)源碼解析等,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
java類(lèi)的加載過(guò)程以及類(lèi)加載器的分析
這篇文章給大家詳細(xì)講述了java類(lèi)的加載過(guò)程以及類(lèi)加載器的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友可以學(xué)習(xí)下。2018-08-08
springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫(kù)配置過(guò)程
這篇文章主要介紹了springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫(kù)配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像)
java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像),需要的朋友可以參考一下2013-04-04
Java中Future和FutureTask的示例詳解及使用
Java中的Future和FutureTask通常和線(xiàn)程池搭配使用,用來(lái)獲取線(xiàn)程池返回執(zhí)行后的返回值,下面這篇文章主要給大家介紹了關(guān)于Java中Future和FutureTask使用的相關(guān)資料,需要的朋友可以參考下2021-11-11
SpringBoot整合MyBatis Plus實(shí)現(xiàn)基本CRUD與高級(jí)功能
Spring Boot是一款用于快速構(gòu)建Spring應(yīng)用程序的框架,而MyBatis Plus是MyBatis的增強(qiáng)工具,本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中整合MyBatis Plus,并展示其基本CRUD功能以及高級(jí)功能的實(shí)現(xiàn)方式,需要的朋友可以參考下2024-02-02

