将泛型类传递给java函数?

时间:2010-05-18 05:53:23

标签: java generics

将类传递给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案例。

2 个答案:

答案 0 :(得分: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)

但根本不需要这样做。

答案 1 :(得分:5)

ArrayList.class的类型为Class&lt; ArrayList&gt;,而参数应为Class&lt; List&gt;。这些类型不兼容,原因与List&lt; Integer&gt;相同。不是列表&lt; Number&gt;。

您可以按如下方式定义函数,并获得预期的行为:

public void doStuffToList(Class<? extends List> className)