我有一个Field f,在我检查之后发现它是List类型,我可以得到它的泛型类型。
但是如何创建一个具有此泛型类型的新List并将新实例放入其中?
if (List.class.isAssignableFrom(f.getType())) {
Type genericType = f.getGenericType();
List<genericType> a = new ArrayList(); // ?????? Error
}
例如,我有一个类型为List<MyObject>
是否可以通过反射创建ArrayList<MyObject>
的新实例?
答案 0 :(得分:4)
您无法在运行时执行此操作。您可以做的最好的事情是创建一个List&lt;?&gt;并自己做运行时类型检查。
如果你很好奇为什么会这样,请查看&#34;输入erasure&#34;。 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
或者,您可以尝试克隆旧列表,但只有list的实现具有clone()方法,而不是List接口,并且它只执行浅拷贝。
祝你好运!答案 1 :(得分:3)
我通常做的是:
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;
}
您需要应用运行时约束和检查但我已经使用了太多次并且它可以工作,事实是当我进入这些实现时,整个周围的体系结构在未知对象类型上中继,这很棘手