2010-03-09 3 views
6

Учитывая, что Date имеет метод «after (Date)», а Timestamp имеет метод переопределения, который он назвал «после (Timestamp)», почему после метода в Date called в следующем коде?Как работают ковариативные типы параметров в java

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

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 

ответ

10

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

Timestamp перегрузки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, даже если вы прошли различные значения в конструкторах.

Стоит отметить этот бит в docs for Timestamp хотя:

Из-за различий между класса Timestamp и класса java.util.Date упоминалось выше, это рекомендуется код не смотреть Значения метки времени в качестве примера экземпляра java.util.Date. Отношение наследования между Timestamp и java.util.Date действительно обозначает наследование реализации, и не наследование типов.

Похоже, довольно слабое использование наследования для меня, честно говоря, - но тогда в Java есть много того :(

+0

после окончания срока методы Даты не сравнить Nanos –

+0

@s_t_e_v_e: Ах -. Я немного исказил вывод: '! X.after (y)' не то же самое, что 'y.after (x)' - это то, что предлагает ваш вывод. –

+0

Теперь должно быть более ясно. –