本文是作者在對Type五大分支類型具體所表達的定義在探索過程的總結。
1.在java中type總共分為5大分支類型:
????原始類型(Class):基本數據類型、枚舉、數組等和泛型無關;
????參數化類型(ParameterizedType):帶有泛型的類型,也就是帶有參數化類或者接口對應的類型;
????數組類型(GenericArrayType):帶有泛型的數組類型,也就是帶有參數化類或者接口所表示的數組對應的類型;
????類型變量(TypeVariable):泛型本身的類型;
? ? 通配符類型(WildcardType) :通配符對應的類型。
從上面的基本定義可以看出,要想理解這type的5大分支類型,還是要對泛型有一定的了解,我們知道在泛型還沒出現之前,描述類的類型是Class,隨著語言的優化,泛型的出現,而Class又無法描述泛型,故而出現了其余四種對于涉及泛型的描述。
對于泛型大致分為兩種:
? ? ? ? 基本泛型、通配符泛型。
有了這些基礎之后我們就可以對上面五中type分支類型進行剖析;
1.原始類型Class:不涉及泛型的所有類跟接口所對應的類型均是Class類型。
比如String s、String []s1、List list等對應的類型均是Class類型,而List<String> list1卻不是Class類型。
2.參數化類型ParameterizedType:帶有參數化的類或者接口對應的類型,比如List<String> s1、Map<K,V> map等對應的類型均是ParameterizedType類型,而List s1、Map map對應的類型是Class。
3.數組類型(GenericArrayType):帶有參數化的類或者接口所表示的數組對應的類型,比如List<String> []s、Map<K,V> map[]等對應的類型均是GenericArrayType類型,而List []s、Map map[]是Class類型。
4.類型變量(TypeVariable):泛型本身的類型,比如T s中T對應的類型就是TypeVariable類型。
5.? 通配符類型(WildcardType) :通配符對應的類型。? extends Map中?對應的類型就是WildcardType類型。
2.實例分析:
1.List<String> list包含哪幾種類型?
答:包含2種類型:List<String>對應ParameterizedType類型,其中的String對應Class類型
2.Map<K,String> map包含哪幾種類型?
答:包含3種類型:Map<K,String>對應ParameterizedType類型,其中K對應TypeVariable類型,String對應Class類型。
3.Map<String,V> [] maps包含哪幾種類型?
答:包含4種類型:Map<String,V> []對應GenericArrayType類型,其中Map<String,V>對應ParameterizedType類型,String是Class類型,V是TypeVariable類型
4.Set<? extends Map> set包含哪幾種類型?
答:包含2種類型:Set<? extends Map>對應ParameterizedType類型,其中?對應于WildcardType類型。
3.實戰
結果
4.源碼:
實體bean:
@Data
public class TestBean {
private Listlist;
? ? private Mapmap;
? ? private Map []maps;
? ? private Setset;
}
@Slf4j
public class Main {
public static void main(String[] args)throws NoSuchFieldException {
Class clz = TestBean.class;
? ? ? ? Field list_field = clz.getDeclaredField("list");
? ? ? ? Field map_field = clz.getDeclaredField("map");
? ? ? ? Field maps_field = clz.getDeclaredField("maps");
? ? ? ? Field set_field = clz.getDeclaredField("set");
? ? ? ? Type type = list_field.getGenericType();
? ? ? ? System.out.println("變量List<String> list所涉及的類型:");
? ? ? ? toType(type);
? ? ? ? if (typeinstanceof ParameterizedType) {
for (Type actualTypeArgument : ((ParameterizedType) type).getActualTypeArguments()) {
toType(actualTypeArgument);
? ? ? ? ? ? }
}
System.out.println();
? ? ? ? Type type1 = map_field.getGenericType();
? ? ? ? System.out.println("變量Map<K,String> map所涉及的類型:");
? ? ? ? toType(type1);
? ? ? ? if (type1instanceof ParameterizedType) {
for (Type actualTypeArgument1 : ((ParameterizedType) type1).getActualTypeArguments()) {
toType(actualTypeArgument1);
? ? ? ? ? ? }
}
System.out.println();
? ? ? ? Type type2 = maps_field.getGenericType();
? ? ? ? System.out.println("變量Map<String,V> [] maps所涉及的類型:");
? ? ? ? if (type2instanceof GenericArrayType) {
GenericArrayType genericArrayType2 = (GenericArrayType) type2;
? ? ? ? ? ? toType(genericArrayType2);
? ? ? ? ? ? Type type3 = genericArrayType2.getGenericComponentType();
? ? ? ? ? ? if (type3instanceof ParameterizedType) {
ParameterizedType parameterizedType2 = (ParameterizedType) type3;
? ? ? ? ? ? ? ? toType(parameterizedType2);
? ? ? ? ? ? ? ? Type[] type4 = parameterizedType2.getActualTypeArguments();
? ? ? ? ? ? ? ? for (Type type5 : type4) {
toType(type5);
? ? ? ? ? ? ? ? }
}
}
System.out.println();
? ? ? ? Type type3 = set_field.getGenericType();
? ? ? ? System.out.println("變量Set<? extends Map> set所涉及的類型:");
? ? ? ? if (type3instanceof ParameterizedType) {
ParameterizedType parameterizedType3 = (ParameterizedType) type3;
? ? ? ? ? ? toType(parameterizedType3);
? ? ? ? ? ? Type[] type6 = parameterizedType3.getActualTypeArguments();
? ? ? ? ? ? for (Type type7 : type6) {
toType(type7);
? ? ? ? ? ? }
}
}
public static void toType(Type type) {
String s;
? ? ? ? if (typeinstanceof Class) {
s ="Class";
? ? ? ? }else {
s = type.getClass().getTypeName().substring(39);
? ? ? ? }
System.out.println(new StringBuffer(type.getTypeName()).append("的類型是:").append(s));
? ? }
}
打印結果:
變量List<String> list所涉及的類型:
java.util.List<java.lang.String>的類型是:ParameterizedTypeImpl
java.lang.String的類型是:Class
變量Map<K,String> map所涉及的類型:
java.util.Map<K, java.lang.String>的類型是:ParameterizedTypeImpl
K的類型是:TypeVariableImpl
java.lang.String的類型是:Class
變量Map<String,V> [] maps所涉及的類型:
java.util.Map<java.lang.String, V>[]的類型是:GenericArrayTypeImpl
java.util.Map<java.lang.String, V>的類型是:ParameterizedTypeImpl
java.lang.String的類型是:Class
V的類型是:TypeVariableImpl
變量Set<? extends Map> set所涉及的類型:
java.util.Set<? extends java.util.Map>的類型是:ParameterizedTypeImpl
? extends java.util.Map的類型是:WildcardTypeImpl
以上內容是作者對于java中type的理解,如有錯誤,望評論提醒。