将泛型类传递给java函数?

rod*_*odo 9 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)
    }       
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,List.class和ArrayList.class行可以正常工作,但Integer.class行会导致编译错误.我可以使用Class我的类型而不是T extends Class<List>然后我将不会捕获上面的Integer.class案例.

Boz*_*zho 14

public <T extends List> void doStuffToList(Class<T> clazz)
Run Code Online (Sandbox Code Playgroud)

Class毕竟你要传递一个- 参数应该是类型Class,并且它的类型参数应该是有限的.

其实,<T extends Class<..>手段T == Class,因为Classfinal.然后你修改类的类型参数List- 而不是任何List,只是List.所以,如果你想让你的例子工作,你需要:

public <T extends Class<? extends List>> void doStuffToList(T clazz)
Run Code Online (Sandbox Code Playgroud)

但这根本不需要.


Eya*_*der 5

ArrayList.class的类型为Class <ArrayList>,而参数应为Class <List>.这些类型不兼容,原因与List <Integer>不是List <Number>的原因相同.

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

public void doStuffToList(Class<? extends List> className)
Run Code Online (Sandbox Code Playgroud)