Перегрузки учитываются во время компиляции; переопределения учитываются во время выполнения.
Метка времени перегружает after
, не переопределяет существующий метод - поэтому ваш oneDate.after(twoDate)
рассматривает только методы в java.util.Date
; более того, даже если вы используете one.after(twoDate)
, то все равно будет использовать только after(Date)
, поскольку тип времени компиляции twoDate
равен Date
, а не Timestamp
.
Если вы позвоните one.after(two)
, то , будет использовать Timestamp.after(Timestamp)
.
Date.after(Date)
учитывает только миллисекунды - но Timestamp
только передает целое число секунд в конструктор Date
, поэтому oneDate
и twoDate
имеют одинаковое значение в миллисекундах в Date
, даже если вы передали разные значения конструкторам.
Стоит отметить этот бит в документах для Timestamp
, хотя:
Из-за различий между
Класс отметки времени и java.util.Date
класс, упомянутый выше, это
Рекомендуется, чтобы код не просматривать
Значения отметки времени в общем виде
экземпляр java.util.Date.
наследственные отношения между
Отметка времени и java.util. Дата действительно
обозначает наследование реализации,
а не наследование типов.
Для меня это звучит как довольно плохое использование наследования, если честно - но тогда у Java их много: (