gpt4 book ai didi

java - 如何自动将子类放入 ArrayList 中?

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

我有一个父类(super class),然后是几个子类,像这样:

public abstract class A {
public abstract int getValue();
}

public class B extends A {
public int getValue() {
return 1;
}
}

public class C extends A {
public int getValue() {
return 123;
}
}

public class D extends A {
public int getValue() {
return 15234;
}
}

大约有100个左右的子类。我也有一个经理:

public class Manager {
public static ArrayList<A> list = new ArrayList<A>();
}

我如何“神奇地”将 A 的所有子类的实例添加到 list 而无需手动创建每个子类的实例并将其添加到列表中?也许使用初始化 block ?

编辑

我如何访问 Manager 中的 list 并不重要。我将其编辑为静态。

最佳答案

(第二次尝试 - 我的第一次尝试是基于对问题的误解。)

我假设您想要做的是构建一个(静态)列表:

  • 恰好包含每个子类的一个实例,
  • 提前创建和填充,并且
  • 不涉及在每个子类中创建/添加自身实例到列表中的代码。

首先,实例初始化 block 不会这样做。当您创建一个实例时,会运行一个实例初始值设定项...并且必须新建类(即每个子类)才能发生这种情况。

我认为唯一可行的方法是编写一些毛茸茸的反射代码:

  • 遍历类路径上的所有类,
  • 使用 Class.forName() 加载每一个,
  • 反射(reflection)性地测试该类是否是A的子类,
  • 如果是,反射调用类的无参数构造函数并将生成的实例添加到“列表”。

这是 (IMO) 相当 hacky!!而且它会很昂贵......除非你可以限制需要搜索这些子类的“包空间”。


实际上,这个可能是一个使用enum 可以更好地解决的问题...特别是如果子类没有需要的行为差异 不同的方法实现。 (例如,您的 getValue() 方法可能只返回一个私有(private)变量……您使用构造函数对其进行了初始化。)请参阅@Paul Bellora 的回答。

(如果需要某些子类的多个实例,则阻止此应用的是。enums 是不可能的。)

关于java - 如何自动将子类放入 ArrayList 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226864/

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