List.class
是类型Class<List>
。请注意,List 被引用为原始类型。由于在泛型方法中经常使用传入一个类来确定类型参数,那么有没有办法获得一个完全指定类型的类对象,例如Class<List<Integer>>
or event Class<List<?>>
?
问问题
88 次
4 回答
8
不。在运行时List<Integer>
,List<Object>
和List
是相同的类型,由于类型擦除。
于 2013-05-01T17:22:14.350 回答
0
可以为特定的参数化类(例如 List)编写实用程序方法。
public static <X> Class<List<X>> typedListClass( Class<X> type )
{
return (Class) List.class;
}
然后这工作正常:
Class<List<Integer>> cl = typedListClass( Integer.class )
于 2013-05-01T18:00:56.510 回答
0
否(请参阅 JB 的答案),但是,您可以使用 class.getTypeParameters() 来查找:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getTypeParameters()
于 2013-05-01T17:27:24.547 回答
0
其他答案已经涉及擦除的性质等......所以我将只包括一个如何获取参考的示例:
@SuppressWarnings("unchecked")
Class<List<Integer>> cls = (Class<List<Integer>>)(Class)List.class;
不是最漂亮的东西。但首先您需要完全擦除 to 的类型List.class
,Class
然后才能将其强制转换为Class<List<Integer>>
。在运行时,它等同于 的擦除版本Class cls = List.class
,但无论何时使用该cls
变量,您都会得到编译时检查。
这@SuppressWarnings
是必需的,因为您正在做坏事,并且您想告诉编译器您知道自己是。到底有多糟糕?嗯......你必须小心这种方法,因为你可以在右手边有任何类,编译器不会关心。然后你会在运行时发现问题。:)
于 2013-05-01T19:08:44.603 回答