代码之家  ›  专栏  ›  技术社区  ›  s_t_e_v_e

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

  •  6
  • s_t_e_v_e  · 技术社区  · 16 年前

    假设Date有一个名为“after(Date)”的方法,Timestamp有一个重写它的方法“after(Timestamp)”,为什么

    关于意外结果的问题被问到了 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 回复  |  直到 9 年前
        1
  •  10
  •   Jon Skeet    16 年前

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

    时间戳 超载 after ,它没有 一个现有的方法-所以你的 oneDate.after(twoDate) 只是在考虑 java.util.Date ; 此外,即使你使用 one.after(twoDate) 仍然 只使用 after(Date) twoDate 是 Date 而不是 Timestamp

    如果你打电话 one.after(two) 那个 Timestamp.after(Timestamp) .

    Date.after(Date) 只考虑毫秒-但是 日期 oneDate 和 两个日期 具有相等的毫秒值 ,即使您向构造函数传递了不同的值。

    值得注意的是 docs for Timestamp

    由于 Timestamp类和java.util.Date 上面提到的班级,是 时间戳值通常作为 时间戳和java.util.Date 而不是类型继承。

    推荐文章