使用Java从类数组创建类的新实例

时间:2014-08-11 14:25:40

标签: java arrays class object instance

我正在尝试用Java创建一个类数组。不是对象,而是类。目前我有一个MyBaseClass类,我从中扩展了三个类MyClass1,MyClass2和MyClass3。我将这些类存储到这样的静态数组中:

private static MyBaseClass[] classes = {
        new MyClass1(),
        new MyClass2(),
        new MyClass3()
};

public static MyBaseClass getInstanceOfClass(int index) {
    return classes[index];
}

然后我使用这样的方法:

try {
    MyBaseClass obj = getInstanceOfClass(index).getClass().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}

现在我想知道我能否以更轻松的方式做到这一点。如果我可以创建一个类数组,我可以转义getInstanceOfClass()方法和一些可能的异常。我试过这样做:

private static Class<MyBaseClass>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};

但是这给了我一个错误“不兼容的类型”,因为MyClass1不等于MyBaseClass。有趣的是,这看起来很有效:

private static Class<?>[] classes = {
        new MyClass1().getClass(),
        new MyClass2().getClass(),
        new MyClass3().getClass()
};

但是这个想法太可怕了,甚至还有我的调试器。那么,有什么更好的方法吗?

修改

这有效:

private static Class<?>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};

但是getInstanceOfClass(index).newInstance();的结果是一个Object,所以我必须进行类型转换。在这种情况下,我不确定这是否安全......

1 个答案:

答案 0 :(得分:4)

您必须表明您正在寻找MyBaseClass的可能子类。为此,您可以将? extends添加到通用类型说明中。请注意,这也将接受MyBaseClass本身。

此外,您可以使用.class获取课程的Class个对象,而不是制作一个isntance并调用getClass()

不幸的是,这不适用于数组,因为它们不允许使用泛型类型。所以你必须将它们添加到列表中(这几乎总是一件好事):

private static ArrayList<Class<? extends MyBaseClass>> classes = new ArrayList<Class<? extends MyBaseClass>>();

...

classes.add(MyClass1.class),
classes.add(MyClass2.class),
classes.add(MyClass3.class),