Ошибка абстрактного метода тестирования при печати arraylist

#java #arraylist #abstract

#java #arraylist #аннотация

Вопрос:

Я создал класс Employee, используемый для расчета по еженедельной оплате в качестве абстрактного. Затем я создал 2 подкласса для зарплатных и почасовых сотрудников. Проблема, с которой я сталкиваюсь, заключается в том, что мой тестовый класс не распечатывает список массивов, а затем извлекает правильную оплату раз в две недели. Мог помочь другой набор глаз.

 /** Employee class with abstract method*/
public abstract class Employee {

public String fullName;

/** construct a default employee object*/
public Employee() {
}

public String getFullName() {
    return fullName;
}

public void setFullName(String fullName) {
    this.fullName = fullName;
}

/** abstract method getBIWeeklyPay */
public abstract double getBiWeeklyPay(); 
public void printgetBiWeeklPay() {
   System.out.println("Employee " this.fullName  "'s"  "Bi-weekly pay is:");
}   

}
/**Salary Class*/
public class SalaryEmployee extends Employee {


public SalaryEmployee() {
}

public double salary;

public double getBiWeeklyPay() {
    return salary/(52*2) ;

}

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}
 }
/** Hourly Class*/
public class HourlyEmployee extends Employee {

public double hourlyRate;
public double hoursPerWeek;


public HourlyEmployee() {
}

public double getBiWeeklyPay() {
    return hourlyRate * (hoursPerWeek *2);
}

public double getHourlyRate() {
    return hourlyRate;
}

public void setHourlyRate(double hourlyRate) {
    this.hourlyRate = hourlyRate;
}

public double getHoursPerWeek() {
    return hoursPerWeek;
}

public void setHoursPerWeek(double hoursPerWeek) {
    this.hoursPerWeek = hoursPerWeek;
}   
}
 /**Test Class*/

  import java.util.*;

  public class EmployeeTest {

public static void main(String[] args){

ArrayList<Employee> employees = new ArrayList<Employee>();

SalaryEmployee mike = new SalaryEmployee();
mike.setFullName("Mike Burns");
mike.setSalary(75000.00);
employees.add(mike);

HourlyEmployee tim = new HourlyEmployee();
tim.setFullName("Tim Globe");
tim.setHourlyRate(12.00);
tim.setHoursPerWeek(40.00);
employees.add(tim);
print(employees);

}
 public static void print(ArrayList<Employee> employees){   
    for(Employee e: employees){
      e.printgetBiWeeklyPay();
}
}

  }
  

Комментарии:

1. Вы пробовали использовать отладчик?

2. Кроме того, я почти уверен ArrayList , что у него нет printBiWeeklyPay() метода…

3. Да, есть 2 ошибки, ему не нравится основной метод в тесте, он получает какое-то исключение, а затем не может разрешить печать. Bieklypay(); в список массивов, даже если он должен принадлежать абстрактному и каждому другому методу (зарплата / почасовая оплата).

4. Вам нужно будет быть более конкретным, чем it doesn't like the Main method и особенно для «он получает какое-то исключение».

5. Код даже не компилируется в первую очередь, потому что в ArrayList нет функции printBiWeeklyPay

Ответ №1:

ваш var employees имеет тип ArrayList, но ArrayList не имеет функции printBiWeeklyPay .

вместо этого вы должны создать свою собственную функцию printBiWeeklyPay, которая принимает ArrayList в качестве параметра и вызывает его вместо этого.

Примером может быть:

 public void printByWeeklyPay(ArrayList<Employee> list) {
    for (Employee e : list) {
        System.out.println(e.toString());
    }
}
  

Также вам придется переопределить #toString() в ваших классах Employee, чтобы вернуть некоторый соответствующий вывод.

Ответ №2:

 public static void main(String args[]) {

ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(john); // hourly employee
employees.add(fred); // salary employee
employees.add(bob);  //hourly employee
print(employees);
}

public static void print(ArrayList<Employee> employees) {
   for each employee in employees {
       employee.printBiWeeklyPay();
   }
}
  

Комментарии:

1. Это довольно близко к тому, что делает данный ответ… Перебирает сотрудников в списке и печатает каждого из них. Однако вам нужно будет определить printBiWeeklyPay() метод для этого типа Employee .

2. Ну, если вы хотите печатать bieklypay(), вам нужно что-то, что будет печатать, верно?

3. 🙂 да, глупый я, теперь у меня есть оператор System.out.print() как часть этого метода. Однако, поскольку оператор печати находится в классе «Employee», и именно там находится аннотация для ‘getBiWeeklyPay’, как заставить его получать от сотрудников определенный тип оплаты, т.Е. зарплату или почасовую. К вашему сведению, я вернулся и сделал их все одинаковыми, я заметил, что я использовал getBiweeklyPay в sper и подклассах, так что теперь я сделал этот шаг.

4. Если я правильно понимаю, ваш переопределенный getBiWeeklyPay() должен позаботиться о зарплате / почасовой оплате

5. Да, это должно быть, но я, похоже, не могу вызвать его в инструкции print, поэтому при вызове метода print в тесте он не выполнит вычисление. Я обновлю весь код из моего первоначального сообщения.