获取generics类类型

嗨,有没有办法在Java中获得静态generics类类型

我最终得到了构造

List l = new ArrayList(); Class<List> c = (Class<List>)l.getClass(); 

我想知道,如果存在类似的东西:

  Class c = List.class; 

(我真的不想构造新的Object只是为了得到它的类型)

谢谢

由于所有List类在运行时实际上对应于同一个类,因此您可以这样做:

 Class> c = (Class>) List.class; 

但由于某种原因,Java不喜欢它。 用String测试:

 Laj.java:9: inconvertible types found : java.lang.Class required: java.lang.Class> Class> c = (Class>) List.class; 

那么,让我们愚弄它:

 Class> c = (Class>) (Class) List.class; 

这很愚蠢,但它确实有效。 它产生一个“未经检查”的警告,但你的例子也是如此。 但请注意,它不会导致与您的示例相同的类。 您的示例返回对象的实际类,即ArrayList 。 显然,这个返回List

基本上,只是为了欺骗编译器。 在运行时,无论如何它都是一个简单的Class

一种实用方法:

 public static > Class cast(Class classC, Class classE) { return (Class)classC; } Class> c = cast(List.class, TaskLocalConstraints.class); 

如果您需要一个真正的Type完成运行时generics类型信息,那就是一个不同的故事。

我不确定你是否注意到了,但在你的例子中,你将在“c”变量中得到java.util.ArrayList类。 我不确定这是不是你的观点。 但是,如果我们假设,那是的是:

 @SuppressWarnings("unchecked") Class> c = (Class>) ArrayList.class; 

但是,如果您需要列表,请使用:

 @SuppressWarnings("unchecked") Class> c = (Class>) List.class; 

我添加了@SuppressWarnings注释以消除警告。 此批注可以用于任何粒度,因此您也可以使用它标记本地代码。

这种方法的关键思想是generics是擦除 。 在运行时没有关于它们的信息,上述分配是正确的。

我能想到的最接近的解决方法称为超类型令牌 。 当然有人在我之前想到了它;)根据你的背景,你可能会发现这个想法很有用。

干杯!

您可以获取List的类,它将是Class c = List.class 。 遗憾的是,在Java中,有关generics的信息不会保留在运行时,因此在编译之后, List将变为简单的List