statement:本篇內(nèi)容只是建立在我目前經(jīng)驗(yàn)的基礎(chǔ)之上,必然有不完善甚至是不正確的地方,請謹(jǐn)慎閱讀,如果能指出錯誤與不足之處,更是不甚感激
一、接口Type
接口Type(注意是java.lang.reflect中的),代表了Java中泛型類型超接口,實(shí)現(xiàn)它的共有四個接口和一個類,即接口:ParameterizedType、GenericArrayType、WildcardType、TypeVariable<D>,還有類:Class
-
ParameterizedType代表的是像List<String> x、Person<Integer> x(Person是一個虛構(gòu)的帶泛型的類)這樣的,x的類型就會是ParameterizedType -
GenericArrayType代表的是像List<String>[] x、Person<Integer>[] x這樣的由ParameterizedType類型組合起來的類型,這時x的類型會是GenericArrayType -
TypeVariable代表是泛型變量,比如T x或者List<T> x,前者x的類型為TypeVariable,后者x本身是ParameterizedType,但是其泛型參數(shù)列表的第一個(共一個)參數(shù)的類型是TypeVariable,不同于List<String>,由于String是確定的類,所以其泛型參數(shù)列表第一個參數(shù)類型是Class -
WildcardType與TypeVariable相似,只是其代表的是一種更廣范圍的泛型變量,比如? extends T、? extends Person等等,如List<? extends Person>其泛型參數(shù)列表的第一個參數(shù)類型即為WildcardType而不是TypeVariable
二、一段實(shí)驗(yàn)代碼與結(jié)果
代碼:
public class Test<T> {
private String str;
private int age;
private String[] strArr;
private List<T> tList;
private List<T>[] tListArr;
private List<Type> typeList;
private List<? extends Type> unKnowTypeList;
private List<? extends T> unKnowTList;
private T t;
public static void main(String... args){
Test test = new Test();
Arrays.stream(Test.class.getDeclaredFields()).forEach(item -> {
Type type = item.getGenericType();
System.out.println(item.getName() + "--------->" +type.getClass());
if(type instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType)type;
if (pt.getOwnerType() != null) {
System.out.println(pt.getOwnerType().getTypeName());
}
System.out.println(item.getName() + "----rawType----->" +pt.getRawType().getTypeName());
Arrays.stream(pt.getActualTypeArguments()).forEach(ar -> {
System.out.println(item.getName() + "----argType," + ar.getTypeName() + "----->" +ar.getClass() );
});
}else if(type instanceof GenericArrayType){
GenericArrayType pt = (GenericArrayType)type;
System.out.println(item.getName() + "----componentType,"+pt.getGenericComponentType().getTypeName() + "----->" +pt.getGenericComponentType().getClass());
}
});
}
}
結(jié)果:
str--------->class java.lang.Class
age--------->class java.lang.Class
strArr--------->class java.lang.Class
tList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
tList----rawType----->java.util.List
tList----argType,T----->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
tListArr--------->class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl
tListArr----componentType,java.util.List<T>----->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
typeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
typeList----rawType----->java.util.List
typeList----argType,java.lang.reflect.Type----->class java.lang.Class
unKnowTypeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
unKnowTypeList----rawType----->java.util.List
unKnowTypeList----argType,? extends java.lang.reflect.Type----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
unKnowTList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
unKnowTList----rawType----->java.util.List
unKnowTList----argType,? extends T----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
t--------->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
參考文檔:
[1] java Type 詳解