java泛型程序设计——反射和泛型
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java泛型程序設計 的 反射和泛型 的相關知識;
【1】反射和泛型相關
1.1)現在, Class類是泛型的, 如 String.class 實際上是一個 Class 類的對象(事實上, 是唯一的對象);
1.2)類型參數十分有用, 因為它允許Class 方法的返回類型更加具有針對性。
- 1.2.1)下面的Class 中的方法就使用了類型參數:
對上述語句的分析(Analysis):
- A1)newInstance 方法: 它返回一個實例, 這個實例所屬的類由默認的 構造器獲得, 它的返回類型目前被聲明為 T, 其類型與 Class 描述的類相同, 這樣就免除了類型轉換;
- A2)如果給定的類型確實是T的一個子類型, cast 方法就會返回一個 現在聲明為 類型T的對象, 否則, 拋出一個 BadCastException 異常;
- A3)如果這個類不是 enum 類或類型T 的枚舉值的數組, getEnumConstants 方法將返回 null;
- A4)最后, getConstructor 與 getDeclaredConstructor 方法返回一個 Constructor 對象。 Construtor 類也已經變成 泛型, 以便 newInstance 方法有一個正確的 返回類型;
【2】使用 Class 參數進行類型匹配
2.1)有時, 匹配泛型方法中的Class 參數的類型變量很有使用價值。 看個荔枝(據說比較權威)
public static <T> Pair<T> makePair(Class<T> c) throws InstantiationException , IllegalAccessException {return new Pair<>(c.newInstance (), c.newInstance()); }- 2.1.1)如果調用 makePair(Employee.class)
- 2.1.2)Employee.class 是類型 Class< Employee> 的一個對象。 makePair 方法的類型參數T 同 Employee 匹配, 并且編譯器可以推斷出這個方法將返回一個 Pair< Employee>;
【3】虛擬機中的泛型類型消息
3.1)java泛型的卓越特性之一是在虛擬機中 泛型類型的擦除;
- 3.1.1)如 原始的 Pair類知道源于泛型類 Pair< T> , 即使一個 Pair類型的對象無法區分是由 Pair< String> 構造的還是由 Pair< Employee> 構造的;
- 3.1.2)類似的, 看一下方法
3.2)可以用反射API類確定:
- 3.2.1)這個泛型方法有一個叫做T的類型參數;
- 3.2.2)這個類型參數有一個子類型限定, 其自身又是一個泛型類型;
- 3.2.3)這個限定類型有一個通配符參數;
- 3.2.4)這個通配符參數有一個 超類型限定;
- 3.2.5)這個泛型方法有一個泛型數組參數;
Conclusion) 一句話, 需要重新構造實現者聲明的泛型類以及方法中的所有內容。 但是, 不會知道對于特定的對象或方法調用,如何解釋類型參數;
3.3) 為了表達泛型類型聲明, java SE 5.0 在 java.lang.reflect 包中提供了一個新的接口 Type, 該接口有如下子類:
- 3.3.1)Class 類:描述具體類型;
- 3.3.2)TypeVariable接口: 描述類型變量(如 T extends Comparable< ? super T>);
- 3.3.3)WildcardType接口:描述通配符(如? super T);
- 3.3.4)ParameterizedType 接口:描述泛型類或接口類型;(如 Comparable< ? super T>);
- 3.3.5)GenericArrayType 接口: 描述泛型數組(如 T[]);
3.4)看個荔枝:(使用 泛型反射API 打印出給定類的有關內容), 如果用Pair類運行, 將會得到如下報告:
Attention)源代碼參見: https://github.com/pacosonTang/core-java-volume/blob/master/chapter12/GenericReflectionTest.java
總結
以上是生活随笔為你收集整理的java泛型程序设计——反射和泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cs重狙快捷键(cs狙击技巧)
- 下一篇: java异常——异常分类+声明已检查异常