【发布时间】:2010-11-07 22:25:31
【问题描述】:
在 java 中有没有办法获得类似 Class<List<Object>> 的实例?
【问题讨论】:
在 java 中有没有办法获得类似 Class<List<Object>> 的实例?
【问题讨论】:
您可以使用以下方法获取 List 类型的类对象:
Class.forName("java.util.List")
或
List.class
但是因为 java 泛型是使用erasures 实现的,所以你不能为每个特定的类获取一个专门的对象。
【讨论】:
List.class
特定类型的泛型在编译时被“擦除”。
【讨论】:
由于类型擦除,在 Class 级别,所有 List 接口都是相同的。它们仅在编译时不同。因此,您可以将Class<List> 作为一种类型,其中List.class 属于该类型,但您无法获得更具体的信息,因为它们不是单独的类,只是类型声明被编译器擦除为显式强制转换.
【讨论】:
如其他答案中所述,Class 表示已擦除类型。要表示ArrayList<Object> 之类的东西,您需要一个Type。一个简单的方法是:
new ArrayList<Object>() {}.getClass().getGenericSuperclass()
1.5 中引入的泛型类型 API 相对容易找到。
【讨论】:
怎么样
(Class<List<Object>>)(Class<?>)List.class
【讨论】:
(Class<?>) 吗?在我的测试中,(Class<List<Object>>)List.class 似乎就足够了。
List.class 的类型为 Class<List>。我上次检查时从Class<List> 到Class<List<Object>> 的转换是非法的(因为没有任何类型可能是两者的子类型)
java.awt.List 而不是接口java.util.List)。检查您的导入。
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);
【讨论】:
(Class<List<Object>>)(Class<?>)List.class 基本相同,但如果您需要多个类对象,则在 ClassUtil 中只有一个未经检查的强制转换。
super 的 super。public static <T> Class<T> castClass(Class<? super T> aClass)
你可以使用杰克逊的ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, ElementClass.class)
没有未经检查的警告,没有空的 List 实例。
【讨论】: