您是否有任何方法可以获得静态通用类类型
我最终得到了构造
List<TaskLocalConstraints> l = new ArrayList<TaskLocalConstraints>();
Class<List<TaskLocalConstraints>> c = (Class<List<TaskLocalConstraints>>)l.getClass();
我想知道,如果存在类似的东西:
Class c = List<TaskLocalConstraints>.class;
(我真的不想构造新的Object只是为了得到它的类型)
由于
答案 0 :(得分:7)
由于所有List<something>
类在运行时实际上都对应于同一个类,因此您可以这样做:
Class<List<TaskLocalConstraints>> c
= (Class<List<TaskLocalConstraints>>) List.class;
但由于某种原因,Java不喜欢它。尝试用String:
Laj.java:9: inconvertible types
found : java.lang.Class<java.util.List>
required: java.lang.Class<java.util.List<java.lang.String>>
Class<List<String>> c = (Class<List<String>>) List.class;
那么,让我们愚弄它:
Class<List<String>> c =
(Class<List<String>>) (Class<?>) List.class;
这很愚蠢,但确实有效。它产生一个“未经检查”的警告,但你的例子也是如此。但请注意,它不会导致与您的示例相同的类。您的示例返回对象的实际类,即ArrayList
。这显然会返回List
。
答案 1 :(得分:2)
基本上,只是为了欺骗编译器。在运行时,无论如何它都是一个简单的Class
。
实用方法:
public static <C extends Collection, E, T extends Collection<E>>
Class<T> cast(Class<C> classC, Class<E> classE)
{
return (Class<T>)classC;
}
Class<List<TaskLocalConstraints>> c =
cast(List.class, TaskLocalConstraints.class);
如果你需要一个真正的Type
完整的运行时泛型类型信息,那就是另一个故事。
答案 2 :(得分:1)
我不确定你是否注意到了,但在你的例子中,你会在“c”变量中得到java.util.ArrayList类。我不确定这是不是你的观点。但是,如果我们假设,那就是:
@SuppressWarnings("unchecked")
Class<? extends List<TaskLocalConstraints>> c = (Class<? extends List<TaskLocalConstraints>>) ArrayList.class;
但是,如果您需要列表,请使用:
@SuppressWarnings("unchecked")
Class<? extends List<TaskLocalConstraints>> c = (Class<? extends List<TaskLocalConstraints>>) List.class;
我添加了@SuppressWarnings注释以消除警告。此批注可以用于任何粒度,因此您也可以使用它标记本地代码。
这种方法的关键思想是泛型是erasure。在运行时没有关于它们的信息,上述分配是正确的。
答案 3 :(得分:1)
我能想到的最接近的解决方法称为super type tokens。当然有人在我之前想到了它;)根据你的背景,你可能会发现这个想法很有用。
干杯!
答案 4 :(得分:0)
您可以获取List的类,即Class c = List.class
。遗憾的是,在Java中,有关泛型的信息未在运行时保留,因此在编译后,List<TaskLocalConstraints>
将变为List
。