在arraylist中使用多态时调用子方法

时间:2012-12-07 21:34:35

标签: java inheritance polymorphism

我有一个小项目,我正在使用继承和多态。我有一个Employee类型的ArrayList,它包含Hourly和Salary员工对象。我希望能够使用for循环在Hourly类中调用calcPay函数,前提是Employee类型的ArrayList中的对象是Hourly雇员。这条线

System.out.println("Wage: " e.calcPay());

给出错误The method calcPay() is undefined for type employee。你如何低估物体?我已经查看了很多论坛,我找不到一个允许我内联的选项,或者没有编写我必须包含在Employee的所有子类中的抽象方法。任何见解都会非常感激。

public class Driver {

     public static void main(String[] args) {

          ArrayList<Employee> list = new ArrayList<Employee>();
          Employee emp1 = new Hourly("Hourly Emp", "123 E Center", "555-555-5555", 00001, "123-45-6789", 12.75);
          Employee emp2 = new Salary("Salary Emp", "123 E Center", "555-555-5555", 00001, "123-45-6789");

          list.add(emp1);
          list.add(emp2);

          for(Employee e : list){
              if(e instanceof Hourly)
              {
                  System.out.println("Wage: " e.calcPay());
              }
           }
    }

    public abstract class Employee {

        private String name, address, phone, ssn;
        private int empNo;

        Employee(String name, String address, String phone, int empNo, String ssn)
        {
            this.name = name;
            this.address = address;
            this.phone = phone;
            this.empNo = empNo;
            this.ssn = ssn;
        }
    }


    public class Hourly extends Employee {

        private double wage;

        Hourly(String name, String address, String phone, int empNo, String ssn, double wage) 
        {
            super(name, address, phone, empNo, ssn);        
                    this.wage = wage;
        }

        public double calcPay(double hours)
        {
                return wage * hours;
        }
   }

2 个答案:

答案 0 :(得分:3)

即使你确定e是每小时类型,你仍然需要强制转换它并使用Hourly类型来调用calcPay()因为e是Employee类型而Employee不知道任何{ {1}}方法,因为您已将calcPay()定义为仅calcPay()类方法。

Hourly

如果您希望所有Employee实例都可以访问calcPay(),则需要在Employee类中将calcPay()定义为抽象方法,然后您可以避免强制转换。

<强>更新

          if(e instanceof Hourly)
              {
                 Hourly hourly = (Hourly)e;   
                  System.out.println("Wage: " hourly.calcPay());
              }

答案 1 :(得分:2)

如果所有calcPay都支持Employee,那么它应该是Employee中的一个抽象方法,它可以让您无需向下转发即可调用它。