如何通过<T>反射了解类型创建一个新列表?



我有一个字段f,在我检查它之后,它的类型是List,我可以得到它的泛型类型。

但是,我如何使用这种泛型类型创建一个新的List并将新实例放入其中呢?

if (List.class.isAssignableFrom(f.getType())) {
    Type genericType = f.getGenericType();
    List<genericType> a = new ArrayList(); // ?????? Error
}

例如,我有一个类型为List<MyObject> 的字段

是否可以通过反射创建ArrayList<MyObject>的新实例?

在运行时不能这样做。你能做的最好的事情就是创建一个列表<gt;并自己进行运行时类型检查。

如果你好奇为什么会这样,请查看"类型擦除"。http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

或者,您可以尝试克隆旧列表,但只有list的实现具有clone((方法,而不是list接口,并且它只执行浅层复制。

祝你好运!

我通常做的是:

public void populateListAndSetToField(Field field,Class<?> type, Object instance, Object... params) throws IllegalArgumentException, IllegalAccessException {
    List<?> list = getGenericList(type, params);
    field.set(instance, list);
}
private <Type> List<Type> getGenericList(Class<Type> type, Object... params) {
    List<Type> l = new ArrayList<Type>();
    for (int i = 0; i < params.length; i++) {
        l.add((Type) params[i]);
    }
    return l;
}

你需要应用一些运行时约束和检查,但我已经用了太多次了,它很有效,问题是当我使用这些实现时,整个周围的体系结构都依赖于未知的对象类型,这很棘手。

这就是我创建列表的方式,

// Get the class from the type
Class fieldClass = Class.forName(((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0].getTypeName());
// Create a new instance
Object instance = fieldClass.newInstance();
return List.of(instance);

相关内容

  • 没有找到相关文章

最新更新