界面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);
}
}
答案 0 :(得分:5)
简单的答案是Delayed
存在,因为自1.8以来存在1.5和default
方法。因此,为了将compareTo
方法作为default
方法提供,必须故意更改接口。
如果没有发生,有几个可能的原因:
它可能已被考虑但因为其中之一而被删除:
对我而言,它看起来不是一个高优先级的问题。大多数情况下,您在JRE提供的Delayed
上下文中遇到ScheduledExecutorService
实现,并且这些实现已经存在,因此不会从这样的更改中受益。
我认为您不会经常在应用程序代码中遇到自定义Delayed
实现,但即使您看到它不同,JRE开发人员显然也决定专注于有用性更明显(或更少)的添加有争议的)。
考虑到这一点,将the discussion合并getDelay()
合同与Comparable
合同相结合,如果Delayed
永不延长Comparable
,情况会更好一点都不毕竟,使用Comparator
或类似的设计模式对属性进行排序并不困难。