从超类到子类执行抽象方法

时间:2015-12-16 14:19:28

标签: java

我正在查看一些旧的考试试卷,我已经找到了其中一个考试,要求你编写一个系统,其中超类是抽象的,并扩展到2个子类

abstract public class Employee {

private String name;
private String id;

public Employee (String name,String id){
       this.name = name;
       this.id = id;
}

public abstract float calculateMonthlyPay();

public String getName(){
    return this.name;
}

public String getID(){
    return this.id;
}

@Override
public String toString(){
  return getID()+" "+getName()+" "+calculateMonthlyPay();
  }    
 }

超类Employee中的所有代码都没问题但文章要求您扩展到子类PartTimeEmp,每月Pay方法是从Float更改为Double 当这样做时,java当然会给出错误,因为它说double与float不兼容我似乎无法找到使这项工作的方法

public class PartTimeEmp extends Employee {

private double hourlyRate;
private int hoursPerWeek;

public PartTimeEmp(String name, String id) {
    super(name, id);
}

@Override
public double calculateMonthlyPay() {
    return 0;
   }

 }

这实际上可以成功吗?任何帮助表示赞赏

谢谢,

克里斯

2 个答案:

答案 0 :(得分:3)

您可以使用java.lang.Number作为抽象方法的返回类型。

然后,您可以在重写方法中返回新的java.lang.Floatjava.lang.Double,因为这些类型会扩展Number

这种技术称为covariant return type,可以从Java 5开始。

这要求你不要使用原语(没有层次结构),而是使用Number包装器。

请注意,对于与货币相关的精确计算,建议使用java.math.BigDecimal而不是float s,double或其包装 - 至少在内部使用方法和类实例的逻辑。

答案 1 :(得分:0)

您还可以使用类型转换技术,而不会产生任何开销,例如:

double x = (double) calculateMonthlyPay();