關于對java中type的理解

本文是作者在對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.實戰


javabean實體


測試main方法

結果

運行結果

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的理解,如有錯誤,望評論提醒。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容