如何使用反射实例化具有泛型类的java.util.ArrayList

时间:2011-01-27 15:22:50

标签: java

如何使用反射实例化具有泛型类的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();
    }
}

6 个答案:

答案 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中的类型而改变。