2010-05-18 141 views
9

將類傳遞給java函數時可以使用泛型嗎?將泛型類傳遞給java函數?

我希望做這樣的事情:

public static class DoStuff 
{ 
    public <T extends Class<List>> void doStuffToList(T className) 
    {  
     System.out.println(className); 
    } 

    public void test() 
    { 
     doStuffToList(List.class);  // compiles 
     doStuffToList(ArrayList.class); // compiler error (undesired behaviour) 
     doStuffToList(Integer.class); // compiler error (desired behaviour) 
    }  
} 

理想的List.class和ArrayList.class線將正常工作,但Integer.class線會導致編譯錯誤。我可以使用Class作爲我的類型而不是T extends Class<List>,但是我不會捕獲上面的Integer.class情況。

回答

14
public <T extends List> void doStuffToList(Class<T> clazz) 

你傳遞一個Class畢竟 - 參數應該是Class類型,類型參數應該是有限的。

實際上,<T extends Class<..>表示T == Class,因爲Classfinal。然後,您將該類的類型參數修復爲List - 不是任何List,只是List。所以,如果你想讓你的例子工作,你需要:

public <T extends Class<? extends List>> void doStuffToList(T clazz) 

但這根本不需要。

+0

謝謝,正是我在找的東西。 – rodo 2010-05-18 06:09:33

+0

@Bozho http://stackoverflow.com/questions/27413818/cannot-access-class-methods-via-generics – Ava 2014-12-11 07:36:39

5

ArrayList.class的類型爲< ArrayList>,而參數應該是類別< List>。這些類型不兼容,出於同樣的原因,列表<整數>不是列表< Number>。

您可以定義函數如下,並獲得了預期的行爲:

public void doStuffToList(Class<? extends List> className) 
相關問題