Java 区分父类的arraylist中的每个子类

Java 区分父类的arraylist中的每个子类,java,arraylist,Java,Arraylist,嗨,我有一个抽象雇员的父类,如果我有ArrayList雇员,我有孩子的秘书、工程师、技术员;在一个for循环中,我随机让employee=新秘书或新工程师 有没有办法知道谁是谁?如果问题问得不好,请原谅我的无知。您可以使用instanceof native operator 大概是这样的: List<Employee> yourList; for (Employee e : yourList) { if (e instanceof Secretary) { S

嗨,我有一个抽象雇员的父类,如果我有ArrayList雇员,我有孩子的秘书、工程师、技术员;在一个for循环中,我随机让employee=新秘书或新工程师

有没有办法知道谁是谁?如果问题问得不好,请原谅我的无知。

您可以使用instanceof native operator

大概是这样的:

List<Employee> yourList;
for (Employee e : yourList) {
    if (e instanceof Secretary) {
        Secretary s = (Secretary)e;
        // do something with s
    } else if (e instanceof Engineer) {
        Engineer eng = (Engineer)e;
        // do something with eng
    }
    // you get the idea...
}
尽管如此,滥用instanceof并不总是一个好主意。通过在类中使用多态性,您将有一个更干净、更面向对象的解决方案。

您当然可以使用instanceof,但它会破坏您设计的目的。每次添加员工的另一个子类型时,您都必须修改大量潜在的代码—此列表中的每个操作位置


另一种可以减少更改数量或至少将更改保持在一个可管理的位置的方法是使用访问者模式或多态性,让代码根据运行时的类型确定要执行的操作。

理想情况下,您不应该在意。如果您需要根据它是哪个特定的类来做不同的事情,那么它应该进入Employee中的一个可能的抽象方法中,子类以不同的方式重写和实现。然后您只需遍历列表并对每个元素调用该方法


这将是正确的面向对象设计。

我强烈建议您在这种情况下实现


您可能还想看一个完整的例子,在狮子和鹿的动物列表中解决这个精确的问题。

注意,有时秘书被提升为工程师。您需要每个员工做的任何事情,例如employee.work。每个员工都知道他们需要做什么,而不是调用方/循环代码。是的,这就是我所寻找的正确的O-O设计,尽管我会像其他人建议的那样深入研究访客模式:谢谢