Как ковариантные типы параметра работают в Java

Учитывая, что Дата имеет метод, названный "после (Даты)", и Метка времени имеет метод переопределения, которые это назвало "после (Метки времени)", почему после метода на Дате, названной в следующем коде?

Вопрос относительно неожиданных результатов задали здесь.

    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

6
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

Перегрузки рассматриваются во время компиляции; переопределения учитываются во время выполнения.

Метка времени перегружается после , она не переопределяет существующий метод, поэтому ваш 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 их много: (

10
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: