从存储在容器中的类构造对象

时间:2013-03-04 17:43:08

标签: java

以下是代码:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public abstract static class Base {
    }

    public static class Derived1 extends Base {
    }

    public static class Derived2 extends Base {
    }

    public static <T> T createObject(Class<T> someClass) {
        T a = null;
        try {
            a = someClass.newInstance();
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
        return a;
    }

    public static void main(String[] args) {
        Derived2 d2 = createObject(Derived2.class);   // here it works

        // here is some array with classes
        Class[] someClasses = new Class[] { Derived1.class, Derived2.class };
        // here is some list which should be filled with objects of these classes
        List<? extends Base> l = new ArrayList();
        // in this loop, the list should be filled with objects
        for(Class c : someClasses) {
            l.add(createObject<? extends Base>(c));   // ERROR: java: illegal start of expression
        }
    }
}

以上代码中的错误就行了:

l.add(createObject<? extends Base>(c));   // ERROR: java: illegal start of expression

如何正确构造for循环以及如何正确调用方法createObject,以便列表l填充数组someClasses中的类对象?

2 个答案:

答案 0 :(得分:1)

您的Class[]应该是Class<? extends Base>[]。或者,使用List<Class<? extends Base>>,这不会导致泛型警告。

答案 1 :(得分:0)

你不能用数组做。您只能创建组件类型为 reifiable types 的数组,因为在运行时,JVM必须在放入元素时进行类型检查(如果元素的类型与数组的{{1}不同抛出)。这意味着您只能创建ArrayStoreExceptionClass的数组,并且由于无法表达元素与Class<?>的关系,因此您必须执行未经检查的强制转换从阵列中取出的物品。

第一个修复正在抛出数组并使用通用容器作为源代码,例如Class<Base>

List<Class<? extends Base>>