重载 compareTo¶
ID: java/wrong-compareto-signature
Kind: problem
Security severity:
Severity: error
Precision: medium
Tags:
- reliability
- correctness
Query suites:
- java-security-and-quality.qls
实现 Comparable<T> 并定义参数类型不是 T 的 compareTo 方法的类会重载 compareTo 方法,而不是覆盖它。这可能并非预期。
示例¶
在以下示例中,对第 17 行的 compareTo 的调用会调用在类 Super 中定义的方法,而不是在类 Sub 中定义的方法,因为 a 和 b 的类型是 Super。这可能不是程序员预期的那个方法。
public class CovariantCompareTo {
static class Super implements Comparable<Super> {
public int compareTo(Super rhs) {
return -1;
}
}
static class Sub extends Super {
public int compareTo(Sub rhs) { // Definition of compareTo uses a different parameter type
return 0;
}
}
public static void main(String[] args) {
Super a = new Sub();
Super b = new Sub();
System.out.println(a.compareTo(b));
}
}
建议¶
要覆盖 Comparable<T>.compareTo 方法,compareTo 的参数必须具有 T 类型。
在上面的示例中,这意味着 Sub.compareTo 的参数类型应更改为 Super。
参考资料¶
J. Bloch,Effective Java(第二版),第 12 项。Addison-Wesley,2008。
Java 语言规范:重写(通过实例方法),重载.
Java 教程:重写和隐藏方法.