协变参数类型如何在java中工作

时间:2010-03-09 22:43:58

标签: java overloading

鉴于Date有一个名为“after(Date)”的方法,而Timestamp有一个覆盖它的方法叫做“after(Timestamp)”,为什么在Date中调用之后的方法?码?

有关意外结果的问题被提出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

1 个答案:

答案 0 :(得分:10)

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

时间戳重载 after,它不会覆盖现有方法 - 所以oneDate.after(twoDate)只考虑{{1}中的方法}};此外,即使您使用java.util.Date仍然仅使用one.after(twoDate),因为after(Date)的编译时类型为twoDate而不是Date }}

如果您致电Timestamp,那么 将使用one.after(two)

Timestamp.after(Timestamp)仅考虑毫秒 - 但Date.after(Date)仅向Timestamp的构造函数传递整数秒,因此DateoneDate具有twoDate中的等毫秒值,即使您将不同的值传递给构造函数。

值得注意的是docs for Timestamp中的这一点:

  

由于之间的差异   Timestamp类和java.util.Date   上面提到的类,它是   建议代码不要查看   时间戳值通常为   java.util.Date的实例。该   继承关系   时间戳和java.util.Date真的   表示实现继承,   而不是类型继承。

说实话,听起来对我来说遗传的使用很差 - 但是Java有很多这样的:(