微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在多态中使用 ArrayList

如何解决在多态中使用 ArrayList

大家好,我需要一些关于包含此代码的“for each”的解释:

for(**Employee e**:hp.getStaff()) {
        
        if(e instanceof Secretary) {
            Secretary s = (Secretary)e;
            System.out.println("Type is: " + s.getClass().getSimpleName() + " and his index is: " + hp.getStaff().indexOf(e));
        }else if(e instanceof Manager) {
            Manager m = (Manager)e;
            System.out.println("Type is: " + m.getClass().getSimpleName() + " and his index is: " + hp.getStaff().indexOf(e));
        }else if(e instanceof Engineer) {
            Engineer en = (Engineer)e;
            System.out.println("Type is: " + en.getClass().getSimpleName() + " and his index is: " + hp.getStaff().indexOf(e));
        }else if(e instanceof Director) {
            Director d = (Director)e;
            System.out.println("Type is: " + d.getClass().getSimpleName() + " and his index is: " + hp.getStaff().indexOf(e));
        }
    }

所以... 粗体显示的是“Employee e”,这是什么意思? 所有类(秘书、经理、总监、工程师)都扩展了员工;一个类 Company 包含属性 private ArrayList staff; ,他的构造函数是:

public Company() {
    
    staff = new ArrayList<Employee>(); 
}

希望你能帮我理解

解决方法

您的代码显示了一个Employees ArrayList,其中在迭代时检查对象的实际类型。让我们理解的一件事是,这个集合中的每个实例都是一个子类型 if Employee 以某种方式。

instanceof 操作符将确定实例所属的实际类。进行此检查后,可以安全地将此实例从 if Employee 引用向下转换为该子类的实例。向下转换可以提供一个特殊的好处,主要是它可以存储在超类型的集合中,同时仍然保留其类型的特定功能。

虽然这个示例不需要显示任何特殊功能,如果子类,System.out 可以很容易地替换为该类具有的任何特殊功能,从而为向下转换提供了实际需要。

想象一下,您想解雇一名员工,但您从集合中选择的任何人都需要在公司内拥有更高的职位。您可以遍历列表,检查该实例是否属于任何适用类型,将其向下转换,然后在该对象上调用诸如 fireEmployee(Employee e) 之类的方法(即使该方法在员工上不存在,它也可以在 Director 上).

java 中的继承允许我们将这些对象存储为一个通用类型,并将它们视为它们自己或父对象,以允许访问这些位(如果有功能)。

,

hp.getStaff() 是一种返回 staff 集合的方法。在这种情况下,您有 ArrayListEmployeeEmployeeSecretaryManagerEngineerDirector 的父类。您的 staff 不包含抽象项目(Employee 对象),而是真实的(ManagerEngineer 等对象)。

因此,在循环中,您遍历 staff 集合:

for (Employee e: hp.getStaff()) {
}

然后您检查每个新项目,无论它是 ManagerEngineer 类的实例。例如,如果它是 Secretary,您将一个项目转换为 Secretary 类并获得它的值:hp.getStaff().indexOf(e)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。