簡體   English   中英

如何將泛型類傳遞給Java中的方法?

[英]How can I pass a generic class to a method in Java?

假設我們有一個函數創建給定特定類的對象:

public static <T> T createObject(Class<T> generic) {
    try {
        return generic.newInstance();
    } catch (Exception ex) {
        return null;
    }
}

我們可以輕松地使用該函數來創建非泛型類型的實例。

public static void main(String[] args) {
    Foo x = createObject(Foo.class);
}

是否可以使用泛型類型執行相同的操作?

public static void main(String[] args) {
    ArrayList<Foo> x = createObject(ArrayList<Foo>.class); // compiler error
}

Java中的泛型是通過類型擦除實現的。

這意味着ArrayList<T>在運行時是一個ArrayList 編譯器只是為您插入強制轉換。

您可以使用以下方法測試:

ArrayList<Integer> first = new ArrayList<Integer>();
ArrayList<Float> second = new ArrayList<Float>();

if(first.getClass() == second.getClass())
{
    // should step in the if
}

此外,只要您確定自己在做什么,只要您非常確定您的代碼不會產生堆污染,您就可以取消警告。

您還可以考慮到您的代碼無法實例化數組,這偶然也需要一個未經檢查的異常:

@SuppressWarnings("unchecked")
public static <T> T[] createArray(Class<T> anyClass, int size){
    T[]result = null;
    try{
        result = (T[]) Array.newInstance(anyClass, size);
    }catch(Exception e){
        e.printStackTrace();
    }
    return result;
}

這就是我使用它的方式:

public static void main(String[] args) throws Exception{
    @SuppressWarnings("unchecked")
    List<String> jediNames = (List<String>) createObject(ArrayList.class);
    jediNames.add("Obiwan");

    String[] moreJedis = createArray(String.class, 10);
    System.out.println(moreJedis.length);
    moreJedis[0] = "Anakin";
}

如果你真的需要,你可以強制它編譯沒有錯誤或警告:

@SuppressWarnings("unchecked")
ArrayList<Foo> x = (ArrayList<Foo>) createObject(ArrayList.class);

唯一的麻煩是,在編譯時,它不能保證createObject()不會向ArrayList添加非Foo類型的對象。 在您的情況下,這可能是安全的,因此您仍然可以獲得泛型的好處而無需使用ArrayList<?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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