获取泛型类类型

时间:2011-02-13 12:15:52

标签: java generics

您是否有任何方法可以获得静态通用类类型

我最终得到了构造

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

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

    Class c = List<TaskLocalConstraints>.class;

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

由于

5 个答案:

答案 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