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

标签 java overloading

鉴于 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

最佳答案

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

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

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

Date.after(Date) 只考虑毫秒 - 但 Timestamp 只将整数秒传递给 Date 的构造函数,所以 oneDatetwoDateDate 中具有相同的毫秒值,即使您将不同的值传递给构造函数也是如此。

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

Due to the differences between the Timestamp class and the java.util.Date class mentioned above, it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance, and not type inheritance.

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

关于java - 协变参数类型如何在 Java 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413181/

相关文章:

java - JList 不会出现在 JFrame 上

java - 具有随机 int 值的字段

java - 无法获取时间戳值

java - 无法在 Netbeans 中将项目从 Tomcat 运行到 Glassfish 服务器

java - 如何在 Java 中获得正确的 JTextField IP 地址?

java - 令人困惑的重载行为

c++ - C++ 类的 iota 增量 vector

c# - 方法重载适用于异常类型吗?

Matlab OOP - 重载大小()

c++ - 如果类型(不)相等,C++ 是否可以有条件地编译代码?