泛型类的类对象(java)

时间:2009-07-03 13:06:49

标签: java generics

在java中有一种方法可以获得类似Class<List<Object>>的实例吗?

7 个答案:

答案 0 :(得分:64)

怎么样

(Class<List<Object>>)(Class<?>)List.class

答案 1 :(得分:32)

public final class ClassUtil {
    @SuppressWarnings("unchecked")
    public static <T> Class<T> castClass(Class<?> aClass) {
        return (Class<T>)aClass;
    }
}

现在你打电话:

Class<List<Object>> clazz = ClassUtil.<List<Object>>castClass(List.class);

答案 2 :(得分:10)

由于类型擦除,在类级别,所有List接口都是相同的。它们在编译时只是不同的。所以你可以将Class<List>作为一种类型,其中List.class属于那种类型,但你不能比那更具体,因为它们不是单独的类,只是类型声明被删除了编译成显式强制转换。

答案 3 :(得分:6)

如其他答案所述,Class代表已删除的类型。要表示ArrayList<Object>之类的内容,您需要Type。一个简单的方法是:

new ArrayList<Object>() {}.getClass().getGenericSuperclass()

1.5中引入的泛型API相对容易找到。

答案 4 :(得分:1)

您可以使用杰克逊的ObjectMapper

ObjectMapper objectMapper = new ObjectMapper();
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, ElementClass.class)

没有未经检查的警告,没有空的List实例浮动。

答案 5 :(得分:0)

您可以使用以下方式获取List类型的类对象:

Class.forName("java.util.List")

List.class

但是因为使用erasures实现java泛型,所以无法为每个特定类获取专用对象。

答案 6 :(得分:0)

List.class

特定类型的泛型在编译时被“擦除”。