为什么实现Comparator<T>接口的类仅需重写compare方法而非所有接口方法?
为什么实现Comparator接口仅需重写compare方法
这个问题的核心逻辑和Java接口的规范、版本特性直接相关:
- Java 8及以上版本引入了**默认方法(default method)**特性,
Comparator<T>接口在该版本做了大幅重构:除了
int compare(T o1, T o2)是未提供实现的抽象方法外,其余比如reversed()(倒序)、thenComparing()(多条件排序)、nullsFirst()(空值排在最前)等扩展方法都被定义为带通用实现的默认方法,接口本身已经完成了基础逻辑编码,实现类不需要强制重写这些方法,有自定义需求时再覆盖即可。 Comparator<T>是标准的函数式接口,带有@FunctionalInterface注解,规范要求这类接口只能存在一个需要实现类重写的抽象方法:接口中声明的
boolean equals(Object obj)方法不属于要求强制实现的抽象方法,因为所有Java类都默认继承自java.lang.Object,自带equals方法的原生实现,只有当你需要自定义比较器本身的相等判断逻辑时,才需要额外重写该方法。
示例代码
// 自定义字符串长度比较器,仅重写compare方法即可正常使用 Comparator<String> lengthComparator = new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.length() - s2.length(); } }; // 直接调用接口默认提供的reversed方法,得到长度倒序比较器,无需额外编码 Comparator<String> reverseLengthComparator = lengthComparator.reversed();
哪怕是Java 8之前的版本,实现Comparator<T>也只需要重写compare方法,因为当时接口仅有compare和equals两个方法,equals同样因为是Object类的原生方法不需要强制重写。
内容的提问来源于stack exchange,提问作者user7336106
相关产品推荐
相关产品推荐

