3

List.class是类型Class<List>。请注意,List 被引用为原始类型。由于在泛型方法中经常使用传入一个类来确定类型参数,那么有没有办法获得一个完全指定类型的类对象,例如Class<List<Integer>>or event Class<List<?>>

4

4 回答 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.classClass然后才能将其强制转换为Class<List<Integer>>。在运行时,它等同于 的擦除版本Class cls = List.class,但无论何时使用该cls变量,您都会得到编译时检查。

@SuppressWarnings是必需的,因为您正在做坏事,并且您想告诉编译器您知道自己是。到底有多糟糕?嗯......你必须小心这种方法,因为你可以在右手边有任何类,编译器不会关心。然后你会在运行时发现问题。:)

于 2013-05-01T19:08:44.603 回答