我对我的介绍课程中的实施有疑问。我想出了一个答案,但编译说"编译错误(第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( );
}
}
非常感谢任何帮助我正确回答的帮助。我已经在这个单一的问题上工作了一个多小时,而且编译错误让我感到困惑不已。谢谢!
答案 0 :(得分:4)
问题是compareTo
方法必须返回int
,但减去工资会产生double
。 Java不允许您在没有强制转换的情况下隐式地将double
转换为int
。虽然演员阵容会得到编译代码,但结果可能是错误的。例如,0.4
的差异将转换为int
0
,错误地报告相等。
您可以测试工资小于,等于或大于,并分别返回-1,0或1。您还可以返回调用Double.compare
的结果,并传递2个工资。
如果您是初学者,那么您可能不会意识到Comparable
interface通常是通用的,并且通过提供类型参数来实现。在这种情况下,这回答了“可以与什么相比”的问题。 compareTo
方法的参数是通用的,因此它采用相同的类型。这也避免了需要在方法体中将obj
强制转换为Person
。
public class Person implements Comparable<Person>
和
public int compareTo(Person obj)
答案 1 :(得分: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);
}