有没有办法获得完全类型的类引用?

时间:2013-05-01 17:19:46

标签: java

List.class的类型为Class<List>。请注意,List被引用为原始类型。由于传入类通常用于泛型方法来确定类型参数,有没有办法获得完全指定类型的类对象,例如Class<List<Integer>>或事件Class<List<?>>

4 个答案:

答案 0 :(得分:8)

没有。在运行时,由于type erasureList<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是必需的,因为你正在做坏事而你想告诉编译器你知道你是。有多糟糕?嗯...你必须小心这个方法,因为你可以在右侧有任何类,而编译器也不在乎。你会在运行时找到问题。 :)