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

时间:2015-11-25 14:13:48

标签: java java-8 default-method

界面Delayed需要任何

  

此接口的实现[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);
    }

}

1 个答案:

答案 0 :(得分:5)

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

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

  • 可能只是没有人考虑过它
  • 它可能已被考虑但因为其中之一而被删除:

    • 可能存在兼容性问题
    • 预期收益不足以证明API更改的合理性
    • 在发布之前有一些优先级要​​高的东西

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

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

考虑到这一点,将the discussion合并getDelay()合同与Comparable合同相结合,如果Delayed永不延长Comparable,情况会更好一点都不毕竟,使用Comparator或类似的设计模式对属性进行排序并不困难。