Учитывая, что Дата имеет метод, названный "после (Даты)", и Метка времени имеет метод переопределения, которые это назвало "после (Метки времени)", почему после метода на Дате, названной в следующем коде?
Вопрос относительно неожиданных результатов задали здесь.
java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L);
java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L);
java.util.Date oneDate = (java.util.Date) one;
java.util.Date twoDate = (java.util.Date) two;
System.out.println("one: " + oneDate.getTime());
System.out.println("two: " + twoDate.getTime());
if (oneDate.after(twoDate)) {
System.out.println(oneDate.getTime() + " after " + twoDate.getTime());
} else {
System.out.println(oneDate.getTime() + " not after " + twoDate.getTime());
}
результаты
one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000
Перегрузки рассматриваются во время компиляции; переопределения учитываются во время выполнения.
Метка времени перегружается после
, она не переопределяет существующий метод, поэтому ваш oneDate.after (twoDate)
учитывает только методы в java.util.Date
; более того, даже если вы используете one.after (twoDate)
, он будет по-прежнему использовать только после (Date)
, потому что тип времени компиляции twoDate
- это Дата
, а не Отметка времени
.
Если вы вызовете one.after (two)
, то , что , будет использовать Timestamp.after (Timestamp)
.
Date.after (Date)
учитывает только миллисекунды, но Timestamp
передает конструктору Date
целое число секунд, поэтому oneDate
и twoDate
имеют одинаковое значение миллисекунды в Date
, даже если вы передали конструкторам разные значения.
Однако стоит отметить этот бит в документации для Timestamp
:
Из-за различий между классом Timestamp и java.util.Date {{1 }}, упомянутого выше, рекомендуется, чтобы код не просматривал значения отметок времени в общем как экземпляр java.util.Date. Отношение наследования между отметкой времени и java.util.Date на самом деле обозначает наследование реализации, , а не наследование типов.
Честно говоря, мне кажется, что наследование используется не очень хорошо, но в Java их много: (