如何使用反射实例化具有泛型类的java.util.ArrayList?我正在编写一个在目标对象上设置java.util.List的方法。目标对象和通用类型的列表在运行时知道:
public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) {
try {
Class clazz = Class.forName("java.util.ArrayList<"+gtype+">");
Object newInstance = clazz.newInstance();
prop.getWriteMethod().invoke(targetObject, newInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:13)
对象在执行时不知道其泛型类型。只需创建一个原始类型的新实例(java.util.ArrayList
)。目标对象不会知道差异(因为不是任何区别)。
基本上,Java泛型是一种编译时的技巧,在编译的类中使用元数据,但只是在执行时进行转换。有关详细信息,请参阅Java generics FAQ。
答案 1 :(得分:7)
创建列表无需进行任何反射。只需传递一些其他类型信息(通常通过传递正确类型的类来完成)。
public static <T> List<T> createListOfType(Class<T> type) {
return new ArrayList<T>();
}
现在您有一个所需类型的列表,您可以/希望直接在targetObject
上设置它而不进行任何反思。
答案 2 :(得分:2)
泛型是编译时唯一的“技巧”。
反射仅限运行时。
基本上,你不能 - 你只能创建一个“原始”ArrayList
。如果需要将其传递给采用泛型参数的方法,则在构造之后直接将其转换为安全(无论“未检查”警告)。在这个例子中,由于使用了通用Objects
,因此无论如何都没有编译时类型安全性,因此不需要进行转换。
答案 3 :(得分:0)
泛型仅在编译时工作,因此如果您使用反射,它们将无法使用。
详细了解此here。
答案 4 :(得分:0)
对象在执行时不知道其泛型类型。只需创建一个原始类型的新实例(java.util.ArrayList)。目标对象不会知道差异(因为没有任何区别)。
答案 5 :(得分:0)
泛型主要是编译时功能。你要做的是和
一样public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) {
prop.getWriteMethod().invoke(targetObject, new ArrayList());
}
注意:这可能会随着Java 7中的类型而改变。