在閱讀本文之前可以先閱讀以下三篇政溃,以便對(duì)Java中的泛型有一個(gè)全局的認(rèn)識(shí):
簡(jiǎn)介
TypeVariable是“類(lèi)型變量”(或者叫“泛型變量”更準(zhǔn)確些)的通用的頂級(jí)接口。在泛型編程中會(huì)用到“泛型變量”來(lái)描述類(lèi)型蛹尝,或者說(shuō)是用來(lái)表示泛型下梢。一般用大寫(xiě)字母作為類(lèi)型變量秤标,比如K昧碉、V埃脏、E等沧烈。
說(shuō)到TypeVariable<D extends GenericDeclaration>就不得不提起java泛型中另一個(gè)比較重要的接口對(duì)象掠兄,GenericDeclaration接口對(duì)象。該接口用來(lái)定義哪些對(duì)象上是可以聲明(定義)“范型變量”,所謂“范型變量”就是<E extends List>或者<E>, 也就是TypeVariable<D extends GenericDeclaration>這個(gè)接口的對(duì)應(yīng)的對(duì)象蚂夕,TypeVariable<D extends GenericDeclaration>中的D是extends GenericDeclaration的迅诬,用來(lái)通過(guò)“范型變量”反向獲取擁有這個(gè)變量的GenericDeclaration。
【注意】類(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)然就不適用于泛型粉楚。
Type[] getBounds()
獲得該“范型變量”的上限(上邊界)辣恋,若無(wú)顯式定義(extends),默認(rèn)為Object模软。類(lèi)型變量的上限可能不止一個(gè)伟骨,因?yàn)榭梢杂?amp;符號(hào)限定多個(gè)(這其中有且只能有一個(gè)為類(lèi)或抽象類(lèi),且必須放在extends后的第一個(gè)燃异,即若有多個(gè)上邊界携狭,則第一個(gè)&后必為接口)。
下面是一個(gè)例子:
package com.ibestcode.wfso.web.blog.Controller;
import java.util.Map;
import java.lang.reflect.*;
public class Test<K extends Integer & Map, V>{
K key;
V value;
public static void main(String[] args) throws Exception
{
Type[] types = Test.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)-------------");
}
}
}
// 下面是運(yùn)行結(jié)果
class com.ibestcode.wfso.web.blog.Controller.Test
interface java.util.Map
K
-------------分割線(xiàn)-------------
class com.ibestcode.wfso.web.blog.Controller.Test
class java.lang.Object
V
-------------分割線(xiàn)-------------
Process finished with exit code 0
D getGenericDeclaration()
獲得聲明(定義)這個(gè)“范型變量”的類(lèi)型及名稱(chēng)回俐,即如:
//當(dāng)聲明這個(gè)“范型變量”的GenericDeclaration是一個(gè)類(lèi)時(shí)
class com.xxx.xxx.classA
//當(dāng)聲明這個(gè)“范型變量”的GenericDeclaration是一個(gè)方法時(shí)
public void com.fcc.test.Main.test(java.util.List)
//當(dāng)聲明這個(gè)“范型變量”的GenericDeclaration是一個(gè)構(gòu)造器時(shí)
public com.fcc.test.Main()
String getName()
獲得這個(gè)“范型變量”在聲明(定義)時(shí)候的名稱(chēng)逛腿。如:K、V仅颇、E等鳄逾。
AnnotatedType[] getAnnotatedBounds()
還不知道什么用,肯定和注解相關(guān)灵莲。