【问题标题】:Implementation help intro to javajava的实现帮助介绍
【发布时间】:2015-04-16 04:33:20
【问题描述】:

我在介绍课程中有一个关于实施的问题。我想出了一个答案,但编译显示“编译错误(第 3 行,第 9 列):可能的精度损失”我对这种精度损失是什么感到困惑。
我的作业问题如下: 回想一下,Person 类实现了 Comparable 接口:

public class Person implements Comparable

现在假设我们要按薪水比较员工。由于 Employee 扩展了 Person,Employee 已经通过 Person compareTo 方法实现了 Comparable,该方法按年龄比较 Person 对象。现在我们要重写 Employee 类中的 compareTo 方法,以便进行工资比较。

对于这个分配,通过为该类实现一个新的 compareTo 方法来修改 Employee 类。在下面提供的空白处输入适当的代码,以便如果员工 A 的工资低于员工 B 的工资,则认为员工 A 低于员工 B。此外,如果员工 A 的工资等于员工 B 的工资,那么它们应该相等。请记住,您输入的代码位于 Employee 类中。

  /**
    * Compares this object with the specified object for order.
    * @param o the Object to be compared.
    */
    public int compareTo(Object obj) 
    {

这是我的代码

    double b= ((Employee)obj).getSalary();
    double a= this.salary;
    return(a-b); 
    }

这是Employee类的代码:

class Employee extends Person
{

     private double salary;

     /**
  * constructor with five args.
  * @param n the name
  * @param ag the age
  * @param ht the height
  * @param p the phone number
  * @param the salary
  */
  public Employee(String n, int ag, int ht, String p, double s)
  {
    super( n, ag, ht, p );
    salary = s;
  }

  /**
   * Get the salary.
   * @return double the salary.
   */
  public double getSalary( )
  {
    return salary;
  }

  /**
   * Raise the employee's salary by a given percent.
   * @param percentRaise
   */
  public void raise(double percentRaise)
  {
    salary *= ( 1 + percentRaise );
  }

    /**
     * Compares this object with the specified object for order.
     * @param o the Object to be compared.
     */
    public int compareTo(Object obj) 
    {
  /* your code goes here */
    }

  /**
    * get a String representation of the employee's data.
    * @return String the representation of the data.
    */
  public String toString( )
  {
    return super.toString( ) + " $" + getSalary( );
  }

}

非常感谢任何帮助我正确回答的问题。我一直在研究这个奇异的问题一个多小时,而那个编译错误让我无所适从。谢谢!

【问题讨论】:

    标签: java implementation


    【解决方案1】:

    问题是compareTo 方法必须返回int,但减去薪水会产生double。 Java 不会让您在没有强制转换的情况下将 double 隐式转换为 int。虽然强制转换将使代码编译,但结果可能是错误的。例如,0.4 的差异将被转换为 int0,错误地报告相等。

    您可以测试小于、等于或大于的薪水,并分别返回 -1、0 或 1。你也可以返回调用Double.compare的结果,传递2个薪水。

    如果您是初学者,那么您可能不知道Comparable interface 通常是通用的,是通过提供类型参数来实现的。在这种情况下,这回答了“与什么相比较?”的问题。 compareTo 方法的参数是泛型的,因此它采用相同的类型。这也避免了需要在方法体中将obj 转换为Person

    public class Person implements Comparable<Person>
    

    public int compareTo(Person obj) 
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    我相信精度的损失是因为您正在对一对双精度执行算术并返回结果,但是您的方法标头被声明为返回一个 int。

    试试你的减法:

    public int compareTo(Object obj) 
    {
        double b= ((Employee)obj).getSalary();
        double a= this.salary;
        return (int) (a-b); 
    }
    

    但是,由于您的意图似乎是对薪水进行比较,请尝试以下操作:

    public int compareTo(Object obj) 
    {
        double b= ((Employee)obj).getSalary();
        double a= this.salary;
        return Double.compare(a, b); 
    }
    

    【讨论】:

    • 非常感谢,我很傻。我知道返回和类型有问题,但我无法弄清楚。这是一个巨大的帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多