获取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 extends List> c = (Class extends List >) ArrayList.class;
但是,如果您需要列表,请使用:
@SuppressWarnings("unchecked") Class extends List> c = (Class extends List >) List.class;
我添加了@SuppressWarnings注释以消除警告。 此批注可以用于任何粒度,因此您也可以使用它标记本地代码。
这种方法的关键思想是generics是擦除 。 在运行时没有关于它们的信息,上述分配是正确的。
我能想到的最接近的解决方法称为超类型令牌 。 当然有人在我之前想到了它;)根据你的背景,你可能会发现这个想法很有用。
干杯!
您可以获取List的类,它将是Class c = List.class
。 遗憾的是,在Java中,有关generics的信息不会保留在运行时,因此在编译之后, List
将变为简单的List
。