簡體   English   中英

運行時泛型類型確定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM