List.class
的类型为Class<List>
。请注意,List被引用为原始类型。由于传入类通常用于泛型方法来确定类型参数,有没有办法获得完全指定类型的类对象,例如Class<List<Integer>>
或事件Class<List<?>>
?
答案 0 :(得分:8)
没有。在运行时,由于type erasure,List<Integer>
,List<Object>
和List
属于同一类型。
答案 1 :(得分:0)
否(请参阅JB的回答),但是,您可以使用class.getTypeParameters()来查找:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getTypeParameters()
答案 2 :(得分:0)
可以为特定的参数化类编写实用程序方法,例如List。
public static <X> Class<List<X>> typedListClass( Class<X> type )
{
return (Class) List.class;
}
然后这很好用:
Class<List<Integer>> cl = typedListClass( Integer.class )
答案 3 :(得分:0)
其他答案已经触及了删除的性质等等......所以我只想提供一个如何获得参考的例子:
@SuppressWarnings("unchecked")
Class<List<Integer>> cls = (Class<List<Integer>>)(Class)List.class;
不是最漂亮的东西。但首先您需要将List.class
的类型完全删除为Class
,然后您可以将其转换为Class<List<Integer>>
。在运行时它等同于Class cls = List.class
的擦除版本,但只要您使用cls
变量,就会得到编译时检查。
@SuppressWarnings
是必需的,因为你正在做坏事而你想告诉编译器你知道你是。有多糟糕?嗯...你必须小心这个方法,因为你可以在右侧有任何类,而编译器也不在乎。你会在运行时找到问题。 :)