這篇文章將為大家詳細講解有關(guān)Java中TypeVariable有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到三元網(wǎng)站設(shè)計與三元網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋三元地區(qū)。
TypeVariable,類型變量,描述類型,表示泛指任意或相關(guān)一類類型,也可以說狹義上的泛型(泛指某一類類型),一般用大寫字母作為變量,比如K、V、E等。
源碼
public interface TypeVariable<D extends GenericDeclaration> extends Type { //獲得泛型的上限,若未明確聲明上邊界則默認為Object Type[] getBounds(); //獲取聲明該類型變量實體(即獲得類、方法或構(gòu)造器名) D getGenericDeclaration(); //獲得名稱,即K、V、E之類名稱 String getName(); }
概述
說到TypeVariable<D>就不得不提起java泛型中另一個比較重要的接口對象,GenericDeclaration接口對象。該接口用來定義哪些對象上是可以聲明(定義)范型變量,所謂范型變量就是<E extends List>或者<E>, 也就是TypeVariable<D>這個接口的對應(yīng)的對象,TypeVariable<D>中的D是extends GenericDeclaration的,用來通過范型變量反向獲取擁有這個變量的GenericDeclaration。
目前實現(xiàn)GenericDeclaration接口的類包括Class, Method, Constructor,也就是說只能在這幾種對象上進行范型變量的聲明(定義)。GenericDeclaration的接口方法getTypeParameters用來逐個獲取該GenericDeclaration的范型變量聲明。詳情可查看:Java源碼解析之GenericDeclaration詳解
類型變量的聲明(定義):<E>,前后需加上尖括號
//1.在類(Class)上聲明(定義)類型變量 class A<T>{ T a; }//之后這里可用任意類型替換T,例如 A<String> as = new A<String>(); //是否看著有點像集合?不錯,集合就是泛型的一個典型運用 //2.在方法上聲明(定義) public <E> void test(E e){} //方法上,類型變量聲明(定義)不是在參數(shù)里邊,而且必須在返回值之前,static等修飾后 //3.聲明(定義)在構(gòu)造器上 public <K> A(K k){}
【注意】類型變量聲明(定義)的時候不能有下限(既不能有super),否則編譯報錯。為什么?T extends classA表示泛型有上限classA,當然可以,因為這樣,每一個傳進來的類型必定是classA(具有classA的一切屬性和方法),但若是T super classA,傳進來的類型不一定具有classA的屬性和方法,當然就不適用于泛型,說的具體點:
//假設(shè) class A<T super classA>{ T t; public void test(){ //這個時候你不能用t干任何事,因為你不確定t具有哪些屬性和方法 //當然,t肯定是有Object方法的,但沒意義 } }
源碼詳解
1.getBounds
獲得該類型變量的上限(上邊界),若無顯式定義(extends),默認為Object,類型變量的上限可能不止一個,因為可以用&符號限定多個(這其中有且只能有一個為類或抽象類,且必須放在extends后的第一個,即若有多個上邊界,則第一個&后必為接口)。
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-------------分割線-------------"); } } } //輸出結(jié)果 class com.fcc.test.Main interface com.fcc.test.interfaceB K -------------分割線------------- class com.fcc.test.Main class java.lang.Object V -------------分割線-------------
2.getGenericDeclaration
獲得聲明(定義)這個類型變量的類型及名稱,即如:
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()); //獲得方法中聲明(定義)的類型變量與上面類似
3.getName
獲得這個類型變量在聲明(定義)時候的名稱
關(guān)于“Java中TypeVariable有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當前名稱:Java中TypeVariable有什么用
本文URL:http://jinyejixie.com/article38/poessp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、定制開發(fā)、用戶體驗、服務(wù)器托管、ChatGPT、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)