如何指定包含泛型的Class变量

时间:2013-01-10 16:51:40

标签: java generics

以下是一个可以解释我的问题的示例:

public class Scratch {
    public <T> Set<T> method(Class<T> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(List.class); //Gives error here.  How do I say List<String>.class?
    }
}

我真的想对上面的clazz变量说List<String>.class,但这不是合适的语法。我只是以错误的方式使用泛型吗?

2 个答案:

答案 0 :(得分:2)

这是语言和标准库的限制。

解决方法是简单地施展它

(Class<List<String>>)(Class)List.class

答案 1 :(得分:0)

使用Class<?> clazz工作。

以下是修改后的代码:

public class Scratch {
    public <T> Set<T> method(Class<?> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(List.class); 
        Set<Map<String,String>> map=s.method(Map.class);
    }
}

感谢@Traroth让我朝着正确的方向前进。我修改了他的答案,以支持一个真正的通用结构,而不仅仅是列表。

编辑:我对上面的答案仍然不满意,因为你可以做些坏事。考虑这个例子:

public class Scratch {
    public <T> Set<T> method(Class<?> clazz){return null;}

    public static void main(String[] args){
        Scratch s=new Scratch();
        Set<List<String>> list=s.method(Map.class); //Should've passed List.class, but the compiler doesn't care.
        Set<Map<String,String>> map=s.method(Map.class);
    }
}

所有内容都会编译,我可能会遇到一些运行时错误(取决于我的实现)。任何其他建议表示赞赏......