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

Fin*_*y11 4 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];
}
Run Code Online (Sandbox Code Playgroud)

然后我使用这样的方法:

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

现在我想知道是否可以以更简单的方式做到这一点。如果我可以创建一个类数组,我也许能够逃避 getInstanceOfClass() 方法和一些可能的异常。我尝试这样做:

private static Class<MyBaseClass>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};
Run Code Online (Sandbox Code Playgroud)

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

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

但这个想法很可怕,它甚至被我的调试器标记了。那么,还有更好的方法吗?

编辑:

这有效:

private static Class<?>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};
Run Code Online (Sandbox Code Playgroud)

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

Thi*_*ler 5

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

除此之外,您可以使用.class来获取Class类的对象,而不是创建实例并调用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),
Run Code Online (Sandbox Code Playgroud)

  • [您无法创建参数化类型的数组。](http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays) (3认同)
  • 这被标记为错误“通用数组创建”。 (2认同)