Java 如何动态地将类键入其子类之一

Java 如何动态地将类键入其子类之一,java,class,generics,Java,Class,Generics,我可能有错误的想法,但请容忍我 我有一个函数,我想用多个子类ComboA、ComboB等中的一种来调用,所有这些都扩展了超类Combo ArrayList<Combos> combos = null; //of type combos, which is super class of Combo A and Combo B switch (which) { case 1: combos = CombosA; //this is

我可能有错误的想法,但请容忍我

我有一个函数,我想用多个子类ComboA、ComboB等中的一种来调用,所有这些都扩展了超类Combo

    ArrayList<Combos> combos = null; //of type combos, which is super class of Combo A and Combo B
    switch (which) {
        case 1:
            combos = CombosA; //this is of type ComboA
            break;
        case 2:
            combos = CombosB; //this is of type ComboB
            break;
}
根据switch语句,我希望在函数组合中使用一个变量来保留子类的所有类函数。这就是为什么我不必为每个组合类型创建一堆函数——我希望使用相同的变量名组合,而不管它是哪个子类

我尝试使用泛型,但问题是,CombosA和CombosB变量是在这个范围之外定义的,是类的全局变量,我不知道如何使用泛型,除非我将函数定义为

public <E extends Combos> void Test(ArrayList <E> CombosA)
或者类似的东西,我想这需要在非全局函数调用中发送另一个单独的变量。我可能能够复制CombosA数组列表并将副本发送到函数中,以使泛型函数正常工作,但我认为一定有更好的方法


任何帮助都将不胜感激

这取决于您接下来要对所选组合执行的操作。由于ComboA和ComboB是combo的子类,理想情况下,您只需调用Combos方法对每个combo执行一个公共操作。然后,每个子类都可以执行自己的函数实现

例如,如果您要对ComboA或ComboB等进行某种更新,那么Combos类中可能有一个更新方法。ComboA有其更新版本,ComboB有其更新版本。然后,您的循环只是在调用update方法的组合上循环,知道每个组合都将执行正确的操作,而无需指定类型


这有帮助吗?

但是ComboA和ComboB都有不同的变量,这是函数其余部分运行所必需的。比如,ComboA可能有一个ComboB没有的变量a,ComboB有B但ComboA没有,但是我没有用一堆重复的代码编写两个完全不同的函数,而是想用几个switch语句创建一个函数,只是切换重要的行,比如将ComboA.getA更改为ComboB.getB。我的设计是错的,还是有意义?你好,安东尼。你想做的是正确的ComboA和ComboB可以也应该有不同的变量、方法等,但是当你想在循环中以一种通用的方式处理它们时,循环需要调用一个通用的方法,而不关心它是a还是B等。这个通用的方法可以使用通用父类中的通用代码,只是将特定的变量作为参数传递给父方法。或者,您可以将此公共代码放在ComboA和ComboB都使用的一些密切相关的助手类中。我需要添加一个通用方法来处理对象本身的差异,而不是试图从不属于它的地方提取逻辑,这与泛型无关。