在java中有一种方法可以获得类似Class<List<Object>>
的实例吗?
答案 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
特定类型的泛型在编译时被“擦除”。