2

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

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?
    }
}

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

4

2 回答 2

2

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

解决方法是简单地粗暴地施放它

(Class<List<String>>)(Class)List.class
于 2013-01-10T17:24:07.987 回答
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);
    }
}

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

于 2013-01-10T17:04:20.910 回答