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

Posted

技术标签:

【中文标题】使用 Java 从类数组创建类的新实例【英文标题】:Create new instances of a class from an array of classes with Java 【发布时间】:2014-10-04 10:07:23 【问题描述】:

我正在尝试在 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(); 的结果是一个对象,所以我必须进行类型转换。我不确定在这种情况下是否安全......

【问题讨论】:

我不认为你可以创建泛型类型的数组,因为类型擦除 这其中最令人不安的是,至少android Studio 不会将Class&lt;?&gt;[]Class&lt;MyBaseClass&gt;[] 标记为错误。但是Class&lt;? extends MyBaseClass&gt;[] 被标记了。 【参考方案1】:

您必须表明您正在寻找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),

【讨论】:

这被标记为错误“通用数组创建”。 你是对的,数组不允许子类,你可以将它们存储在一个列表中。 我没有列表。您在上面发布的代码被标记为错误。有趣的是Class&lt;?&gt;[]Class&lt;MyBaseClass&gt;[] 没有被标记,但Class&lt;? extends MyBaseClass&gt;[]gets。 You cannot create arrays of parameterized types. 从 java 7 开始,你也可以使用菱形运算符

以上是关于使用 Java 从类数组创建类的新实例的主要内容,如果未能解决你的问题,请参考以下文章

从类指针向量创建成员变量向量

数组常用方法

尝试在 Google 表格中使用 XML 从类的最后一个实例中获取数据

有没有办法禁止从类的实例向类添加属性?

Java - 从类中调用私有数组列表[重复]

面向对象进阶