为什么 Temporal 在 Java 8 jsr310 中不扩展可比性

2022-09-04 01:46:03

java.time.temporal.Temporal 的文档包含以下说明:

实施要求:[...]所有实现都必须具有可比性。

为什么时间不只是扩展可比性?

背景:我想使用类似的时间(而不是像LocalDateTime等子类型),并且不得不求助于一种难以辨认的类型,这也搞砸了NetBeans的自动完成功能。<T extends Temporal & Comparable<T>>

编辑:我想实现一个时间间隔。contains(Interval i),contains(Temporal t),overlaps(...),ad-joins(...)等的明显实现使用Compeable::compareTo(Comparable c)来比较起点和终点,但对于互操作性(toDuration(),parse(CharSequence cs)))我需要例如持续时间::between(Temporal s,Temporal e)或SubtypeOfTemporal::p arse(CharSequence cs)(产生Temporal)。


答案 1

如果它实现了,每个 suclass 实例都必须与任何其他子类实例具有可比性。例如,将即时与LocalDate进行比较是没有意义的。Comparable<Temporal>

鉴于合约要求它们具有可比性,您可以强制转换为并安全地忽略编译器警告。TComparable<T>


答案 2

尝试实现 ,但是由于Java没有自类型泛型,因此有必要通过其子类型(如)进行归纳。在实践中,这不是一个好的权衡,因为在 的 95% 以上的用法中,生成参数将是未知的,因此 .由于唯一的通用解决方案对于大多数用户来说是冗长且不切实际的,因此没有保留。ComparableTemporalEnumTemporalTemporal<?>

正如JB Nizet的回答所说,在大多数情况下,你可以投向。如果两个输入具有相同的具体类型,您应该不会看到任何问题。ComparablecompareTo

在区间上,我怀疑 a、 an 和 a 的共同点比想象的要少,而一个归纳解可能比编码三个单独的类更糟糕。请记住,可以选择不使用泛型是可以的,前提是已经考虑了权衡。LocalDateRangeInstantIntervalLocalTimeInterval


推荐