Given that Date has a method called “after(Date)” and Timestamp has a method the overrides it called “after(Timestamp)”, why is the after method in Date called in the following code?
The question as to the unexpected results was asked 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());
}
results
one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000
Overloads are considered at compile-time; overrides are considered at execution time.
Timestamp overloads
after, it doesn’t override an existing method – so youroneDate.after(twoDate)is only considering the methods injava.util.Date; furthermore even if you useone.after(twoDate)it would still only useafter(Date)because the compile-time type oftwoDateisDaterather thanTimestamp.If you call
one.after(two)then that will useTimestamp.after(Timestamp).Date.after(Date)only considers the milliseconds – butTimestamponly passes an integral number of seconds to the constructor ofDate, sooneDateandtwoDatehave an equal millisecond value inDate, even though you passed different values to the constructors.It’s worth noting this bit in the docs for
Timestampthough:Sounds like a pretty poor use of inheritance to me, to be honest – but then Java’s got plenty of those 🙁