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

Java 从存储在容器中的类构造对象,java,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 stat

代码如下:

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
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
公共班机{
公共抽象静态类库{
}
公共静态类Derived1扩展了基{
}
公共静态类Derived2扩展了基{
}
公共静态T createObject(类someClass){
T a=零;
试一试{
a=someClass.newInstance();
}捕获(实例化异常e){
}捕获(非法访问例外e){
}
返回a;
}
公共静态void main(字符串[]args){
Derived2 d2=createObject(Derived2.class);//它在这里工作
//下面是一些包含类的数组
Class[]someClasses=新类[]{Derived1.Class,Derived2.Class};
//下面是一些应该用这些类的对象填充的列表

列出您的
类[]
应该是
类您不能使用数组。您只能创建组件类型为可修改类型的数组,因为在运行时,JVM必须在放入元素时进行类型检查(如果元素的类型与数组的类型不同,则抛出
ArrayStoreException
)。这意味着您只能创建
的数组,并且由于无法表示元素与
的关系,因此必须对从数组中提取的项目执行未经检查的强制转换


第一个修复方法是扔掉数组,使用一个通用容器作为源代码,比如
列表。我认为您无法创建
l.add(createObject<? extends Base>(c));   // ERROR: java: illegal start of expression
@SuppressWarnings("serial")
public static void main(String[] args) {

    List<Class<? extends Base>> src = new LinkedList<Class<? extends Base>>() {
        {
            add(Derived1.class);
            add(Derived2.class);
        }
    };

    List<Base> dst = new LinkedList<Base>();

    for (Class<? extends Base> c : src)
        dst.add(createObject(c));

}