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

Seb*_*n S 3 java java-8 default-method

延迟接口需要任何接口

此接口的实现[to]定义一个compareTo方法,该方法提供与其getDelay方法一致的排序.

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

有没有具体的理由将其留给实施班?或者在覆盖超级界面时是否无法创建默认方法?

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

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

简单的答案是Delayed从1.5开始default存在,并且自1.8以来存在方法.因此,为了提供compareTo方法作为default方法,必须有意地改变界面.

如果没有发生,有几个可能的原因:

  • 可能只是没有人考虑过它
  • 它可能已被考虑但被删除,因为:

    • 可能存在兼容性问题
    • 预期的好处不足以证明API变更的合理性
    • 在发布之前,有一些事情具有更高的优先级

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

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


考虑到它,将合同的讨论getDelay()合同相结合Comparable,如果Delayed从来没有延伸过,那就更好Comparable了.毕竟,使用Comparator或类似的设计模式对属性进行排序并不困难.