gpt4 book ai didi

java - 创建具有可变子类标识的实例(w\o instanceof Cases\if-else-)

转载 作者:太空宇宙 更新时间:2023-11-04 14:40:05 25 4
gpt4 key购买 nike

我的问题是这样的:有没有一种方法可以基于属于父类的 100 个子类的类创建实例。您有一个变量可能是这 100 个子类中的一个,但您不确定是哪一个。并且您需要创建类的实例。但由于子类数量较多,在 case\if-else 语句中手动查找是不切实际的,是否有一种方法可以根据您拥有的变量创建一个新实例,如下所示:

object_2 = new (type of object_1)();

还是必须手动执行?

最佳答案

您可以混合使用 Java 泛型和反射来获得您想要的东西。以下是一种潜在实现的示例,使用 ChildAChildB 作为 Parent 的子类:

public class Test {

public static void main(String... args) {
new Test().test();
}

private void test() {
Parent a = new ChildA();
getNewInstance(a);

Parent b = new ChildB();
getNewInstance(b);
}

// T extends Parent makes sure we can only pass in subclasses of Parent
static <T extends Parent> T getNewInstance(T oldInstance) {
Class<T> theClass = (Class<T>) oldInstance.getClass();

try {
return theClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}

class Parent {}

class ChildA extends Parent {
public ChildA() { System.out.println("New ChildA created."); }
}

class ChildB extends Parent {
public ChildB() { System.out.println("New ChildB created."); }
}

输出显示创建了四个单独的子对象:

New ChildA created.
New ChildA created.
New ChildB created.
New ChildB created.

值得一提的是,如果您需要调用参数化构造函数,这会变得更加复杂。

还有许多其他方法可以使用 if-else 或 switch 语句来执行此操作,但您指定不需要 if-else,并且我认为这也适用于 switch。阅读有关工厂设计模式的更多示例。

关于java - 创建具有可变子类标识的实例(w\o instanceof Cases\if-else-),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25047228/

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