CodeQL 文档

重载 compareTo

ID: java/wrong-compareto-signature
Kind: problem
Security severity: 
Severity: error
Precision: medium
Tags:
   - reliability
   - correctness
Query suites:
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

实现 Comparable<T> 并定义参数类型不是 TcompareTo 方法的类会重载 compareTo 方法,而不是覆盖它。这可能并非预期。

示例

在以下示例中,对第 17 行的 compareTo 的调用会调用在类 Super 中定义的方法,而不是在类 Sub 中定义的方法,因为 ab 的类型是 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

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私