重载 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 教程:重写和隐藏方法.