我对Java相对较新,并尝试解决一些基本问题。我的一位朋友让我解释这段代码可能出错的原因。 对我来说它看起来非常好。 我甚至尝试过它并且有效。
你们可以帮帮我吗?
public int compareTo(Object o){
Employee emp = (Employee) o;
return this.id - o.id;
}
我找不到任何好的解释。 id也是一个整数。
答案 0 :(得分:3)
Comparable
是具有泛型的接口,因此它应该是Comparable<Employee>
。 (因此,您确定将员工与员工进行比较,而不是将员工与员工进行比较。)
Employee emp = (Employee) emp;
有意义吗?
您将emp
投射到Employee
并将其放入emp
。也许你的意思是(Employee) o
return this.id - o.id;
您使用的o
是Object
,而Object
没有.id
也许您的意思是emp.id
?
答案 1 :(得分:1)
如果您确定id
是唯一的,并且没有整数溢出(这将需要否定id
),那么该代码应该按预期工作。另一方面,如果两个Emp
(被认为是不同的)可以具有相同的id
(因为它不是我们期望它的名称的标识符),那么它可能导致这样的情况:两个Emp
被认为是平等的,实际上它们不是。
答案 2 :(得分:1)
您没有使用emp实例执行任何操作...如果您尝试将Employee
(this
)与Object o
进行比较,那么始终为{{ 1}},然后你想要Employee
答案 3 :(得分:0)
public int compareTo(Employee o){
return this.id - o.id;
}
如果你真的是个坚持者:
public int compareTo(Object o){
long thisId = this.id;
long oId = o.id;
long result = thisId - oId;
if (result > Integer.MAX_VALUE) result = Integer.MAX_VALUE;
if (result < Integer.MIN_VALUE) result = Integer.MIN_VALUE;
return result;
}
答案 4 :(得分:0)
如果您无法保证ID为正或负,那就变得棘手了。棘手的部分是,如果id变为负数,则减法可能会溢出并产生不正确的结果
答案 5 :(得分:0)
class Employee implements Comparable<Employee> {
public int compareTo(Object o) {
if (o instanceof Employee) {
Employee emp = (Employee) o;
return this.id - emp.id;
}else {
throw new IllegalArgumentException("Parameter not of type Employee!");
}
return null;
}
}
我认为没关系。如果id为负,会出现什么问题?
答案 6 :(得分:-2)
compareTo()也是比较字符串时使用的保留函数。所以也许他想让你注意到同名的方法会引起问题。