gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:44:46 25 4
gpt4 key购买 nike

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

最佳答案

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

关于java - 使用 Java 从类数组创建类的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com