为什么 Delayed 不为 compareTo 提供默认方法?

Why doesn't Delayed provide a default method for compareTo?

接口Delayed需要任何

implementation of this interface [to] define a compareTo method that provides an ordering consistent with its getDelay method.

不过我想知道,为什么 Java 8 中没有默认实现,因为合同要求 compareTo 仅依赖于 getDelay.

是否有特定原因将其留给实施 class?还是覆盖超接口时无法创建默认方法?

编辑:为了让我的问题更容易理解,这里有一个例子:

interface Delayed extends Comparable<Delayed> {

    long getDelay(TimeUnit unit);

    @Override
    default int compareTo(Delayed o) {
      // might not be the perfect "compareTo" implementation, but you get the point
      return o == this? 0:
        Long.compare(this.getDelay(TimeUnit.NANOSECONDS), o.getDelay(TimeUnit.NANOSECONDS);
    }

}

简单的答案是 Delayed 自 1.5 以来存在,而 default 方法自 1.8 以来存在。因此,为了将 compareTo 方法提供为 default 方法,必须故意 更改接口 .

如果没有发生,可能有以下几种原因:

  • 可能根本没有人考虑过它
  • 可能考虑过但放弃了,因为:

    • 可能存在兼容性问题
    • 预期收益不足以证明API改变
    • 发布前有优先级更高的事情要做

对我来说,这看起来不像是一个高优先级的问题。大多数时候,您会在 JRE 提供的 ScheduledExecutorService 上下文中遇到 Delayed 实现,这些实现已经存在,因此不会从此类更改中受益。

我认为您不会经常在应用程序代码中遇到自定义 Delayed 实现,但即使您看到它不同,JRE 开发人员显然决定专注于有用性更明显的添加(或较少商榷)。


考虑一下,将 关于 getDelay() 合同与 Comparable 合同结合起来,如果 Delayed 从未延长 [=18] 会更好=] 完全没有。毕竟,使用 Comparator 或类似的设计模式按 属性 对对象进行排序并不难。