[英]Runtime generic type determination
為什么會這樣。 如果我將匿名泛型類傳遞給類型確定方法 - 一切都很好。 但是如果我在這個方法中傳遞對象 - 控制台輸出是E.
public static void main(String[] args) {
printType(new ArrayList<Integer>() {});
printType(new ArrayList<Integer>());
}
public static void printType(final List<?> list) {
System.out.println(((ParameterizedType) list.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
安慰:
class java.lang.Integer
E
請向我解釋。
第一次調用是傳遞ArrayList<Integer>
的匿名子類的實例。 所以,它類似於:
class YourClass extends ArrayList<Integer>
並調用該方法:
printType(new YourClass());
YourClass
的通用超類或您的案例中的匿名類僅為ArrayList<Integer>
。 所以,這個輸出是清楚的。
至於你的第二種情況,你傳遞的是ArrayList<Integer>
本身的一個實例。 這個類的定義如下:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
所以,這里的通用超類是AbstractList<E>
。
泛型類型的實例化共享相同的Class
實例:
請注意, ArrayList
的所有實例化都在運行時共享同一個類:
new ArrayList<Integer>().getClass() == new ArrayList<String>().getClass();
以上比較會給你true
。 因為getClass()
調用都給你回復:
class java.util.ArrayList
請參閱JLS 8.1.2:通用類和類型參數 :
泛型類聲明定義了一組參數化類型(第4.5節),每個類型參數通過類型參數調用一個。 所有這些參數化類型在運行時共享同一個類。
例如,執行代碼:
Vector<String> x = new Vector<String>(); Vector<Integer> y = new Vector<Integer>(); boolean b = x.getClass() == y.getClass();
將導致變量
b
保持值為true
。
換句話說, getGenericSuperClass()
方法不會為您提供實例化類時使用的實際類型參數,而是它正在擴展的類中使用的類型參數。 現在,由於java.util.ArrayList
的通用超類是AbstractList<E>
。 因此,您獲得的類型參數將僅為E
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.