2010-03-09 23 views
6

鉴于Date有一个名为“after(Date)”的方法,并且Timestamp有一个方法会覆盖它称为“after(Timestamp)”之后,为什么Date中调用方法后的在下面的代码中?协变参数类型如何在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

重载为在编译时考虑;在执行时考虑覆盖。

时间戳重载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构造,所以oneDatetwoDateDate有平等的毫秒值,即使你通过不同的值构造函数。

值得注意的docs for Timestamp该位,但:

由于 时间戳类和上述java.util.Date 类之间的区别,这是 建议代码无法查看 时间戳值通常是java.util.Date的 实例。 时间戳和java.util.Date之间的 继承关系实际上 表示实现继承, 而不是类型继承。

听起来像一个非常贫穷的使用继承给我,说实话 - 但是Java的日期方法后,很多这样:(

+0

的拿到了不比较毫微 – 2010-03-09 22:56:05

+0

@s_t_e_v_e:啊 - 。我误读了输出有点'x.after(Y)'是不一样'y.after(X)' - !。这是你的输出有什么 – 2010-03-09 22:59:39

+0

OK应该是比较清楚现在 – 2010-03-09 23:10:24

相关问题