如何通过反射了解类型创建新的List <T>?

Zuz*_*zEL 4 java reflection

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

但是,如何创建具有此泛型类型的新List并将新实例放入其中?

if (List.class.isAssignableFrom(f.getType())) {

    Type genericType = f.getGenericType();
    List<genericType> a = new ArrayList(); // ?????? Error

}
Run Code Online (Sandbox Code Playgroud)

例如我有一个类型为 List<MyObject>

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

jgi*_*ter 5

您无法在运行时执行此操作。最好的办法是创建一个List <?>并自己检查运行时类型。

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

另外,您可以尝试克隆旧列表,但是只有list的实现才具有clone()方法,而没有List接口,它只会执行浅表复制。

祝好运!


Tac*_*0sS 5

我通常做的是:

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;
}
Run Code Online (Sandbox Code Playgroud)

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