以下是一个可以解释我的问题的示例:
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
,但这不是合适的语法。我只是以错误的方式使用泛型吗?
答案 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);
}
}
所有内容都会编译,我可能会遇到一些运行时错误(取决于我的实现)。任何其他建议表示赞赏......