【问题标题】:How do covariant parameter types work in java协变参数类型如何在java中工作
【发布时间】:2010-03-09 22:43:58
【问题描述】:

鉴于 Date 有一个名为“after(Date)”的方法,而 Timestamp 有一个覆盖它的方法,称为“after(Timestamp)”,为什么在下面调用 Date 中的 after 方法代码?

关于意外结果的问题被问到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

【问题讨论】:

    标签: java overloading


    【解决方案1】:

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

    时间戳重载 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 的实例。这 之间的继承关系 Timestamp 和 java.util.Date 真的 表示实现继承, 而不是类型继承。

    老实说,对我来说,继承的使用听起来很糟糕——但 Java 有很多这样的 :(

    【讨论】:

    • Date 中的 after 方法不比较 nanos。
    • @s_t_e_v_e:啊 - 我有点误读了输出。 !x.after(y)y.after(x) 不同 - 这是您的输出所暗示的。
    猜你喜欢
    • 2016-11-01
    • 2021-02-16
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2021-02-04
    • 2020-01-25
    • 2011-09-02
    相关资源
    最近更新 更多