Я думаю, это может быть связано с поведением Iterator
, возвращаемым ContiguousSet
(возвращаемым Range.asSet()
):
@Override public UnmodifiableIterator<C> iterator() {
return new AbstractLinkedIterator<C>(first()) {
final C last = last();
@Override
protected C computeNext(C previous) {
return equalsOrThrow(previous, last) ? null : domain.next(previous);
}
};
}
private static boolean equalsOrThrow(Comparable<?> left,
@Nullable Comparable<?> right) {
return right != null && compareOrThrow(left, right) == 0;
}
private static int compareOrThrow(Comparable left, Comparable right) {
return left.compareTo(right);
}
Останавливается только тогда, когда следующее вычисленное значение равно , равному правой границе диапазона.
В вашем случае, вы пытались вызвать его, используя Thu Feb 24 02:00:00
вместо Thu Feb 24 00:02:00
для правой границы вашего диапазона?
Я думаю, что это поведение проблематично, и, возможно, стоит спросить, можно ли изменить equalsOrThrow()
, чтобы проверить left <= right
вместо left == right
Кроме того, ваш distance()
метод неверен. Он должен возвращать расстояние в часах, а не в миллисекундах, в соответствии с контрактом метода.
EDIT
При всем этом, я считаю, что реальная проблема заключается в том, что, согласно DiscreteDomain's javadoc:
Дискретный домен всегда представляет
весь набор значений своего типа;
он не может представлять частичные домены
такие как "простые целые числа" или "строки
длиной 5 ".
В вашем случае вы пытаетесь создать отдельный домен за почасовых дат , который является частичным доменом всех дат. Это, я думаю, коренная причина проблемы. Когда у вас есть частичный домен, метод equalsOrThrow
становится ненадежным, и он может «пропустить» правую границу вашего диапазона.