以superClass为参数,操作subClasses的方法

Method That Takes Super Class As Parameter And Manipulates Sub Classes

我有 class "A",它有两个 class 对象的数组列表 "BC" 和 "BD"。 BC和BD继承自抽象class"B".

所以我正在努力做的是,我想做一个 add();方法以B对象为参数,如果参数是BC类型则添加BC对象,如果参数是BD类型则添加BD对象。是否有正确的方法来执行此操作,或者我应该单独添加方法?

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bcArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList)
        {
            //m = create new object of type, either BC or BD;
            bArrayList.add(m);
        }
   }

尝试使用 getClass 方法,即 m.getClass()。

如果你真的需要这样做,那么我想你可以这样做:

public class A {
     private List<B> bcArrayList = new ArrayList<>();
     private List<B> bdArrayList = new ArrayList<>();

     public void add(List<B> bArrayList) {
         for (B item : bArrayList){

             if (item.getClass() == BC.class) {
                 bcArrayList.add(item);

             } else if (item.getClass() == BD.class){
                 bdArrayList.add(item);
             }
         }
     }
}

也就是说,你确定你真的需要它吗?

为什么不将它们放在同一个列表中(它们都是 B 类型的对象),并让子类 BCBD 根据需要表现不同。这就是多态性的意义所在。

我认为最安全的方法是使用 instanceof 运算符。

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bdArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList) {
            for(B element : bArrayList) {
             if(element instanceof BC) {
                 bcArrayList.add((BC) element);
             } else if (element instanceof BD) {
                 bdArrayList.add((BD) element);
             } else {
                 continue;
             }
             }
        }
   }

我认为,如果您想从列表中添加多个对象,那么可以使用一种采用 List<B> 并使用 instanceof

的方法
public void add(List<B> bList) {
    for (B b : bList) {
        if (b instanceof BC) {
            bcArrayList.add((BC)b);
        }
        if (b instanceof BD) {
            bdArrayList.add((BD)b);
        }
    }         
}

但是对于添加单个对象,我认为使用方法重载是最干净的方法

public void add(BC b) {
    bcArrayList.add(b);
}

public void add(BD b) {
    bdArrayList.add(b);
}

当然你可以将它们全部添加到你的 class 中并像这样使用它们

A a = new A();
a.add(new BC());
a.add(new BD());
List<B> list = new ArrayList<>();
list.add(new BC());
list.add(new BD());
a.add(list);