【问题标题】:Passing a generic class to a java function?将泛型类传递给java函数?
【发布时间】:2011-02-20 17:45:54
【问题描述】:

在将类传递给 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&lt;List&gt;,但是我不会捕捉到上面的 Integer.class 情况。

【问题讨论】:

    标签: java generics


    【解决方案1】:
    public <T extends List> void doStuffToList(Class<T> clazz)
    

    毕竟你传递的是Class - 参数应该是Class 类型,它的类型参数应该是有限的。

    其实&lt;T extends Class&lt;..&gt;就是T == Class,因为Class就是final。然后将类的类型参数固定为List——不是任何List,只是List。所以,如果你想让你的例子起作用,你需要:

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

    但这根本不需要。

    【讨论】:

    【解决方案2】:

    ArrayList.class 是 Class 类型,而参数应该是 Class。这些类型不兼容,原因与 List 不是 List 的原因相同。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2021-10-13
      相关资源
      最近更新 更多