以下示例中的实用程序方法仅用于说明目的。
在下面的示例中,instance method
调用被分派到引用类型而不是运行时对象。
import java.sql.Timestamp;
import java.util.Date;
public class DynamicMethodDispatchEx {
public static void main(String[] args) {
Timestamp now = new Timestamp(System.currentTimeMillis());
Timestamp beforeNow = new Timestamp(now.getTime() - 1);
System.out.println("Finding newest in " + now + " and " + beforeNow);
System.out.println("Attempt 1: " + staticFindNewer(beforeNow, now));
System.out.println("Attempt 2: " + staticFindNewer(now, beforeNow));
}
public static Date staticFindNewer(Date one, Date two) {
if (one.after(two)) {
return one;
} else {
return two;
}
}
}
下面是我得到的输出
Finding newest in 2016-08-23 17:56:36.375 and 2016-08-23 17:56:36.374
Attempt 1: 2016-08-23 17:56:36.375
Attempt 2: 2016-08-23 17:56:36.374 // <---
经过一番调查,我发现尝试 1 和 2 中的差异java.util.Date.after(Date)
被调用,staticFindNewer()
并且是由于使用 Date 的方法导致的精度损失。
但是,我对动态调度感到困惑。我希望Timestamp#after(Timestamp)
被调用,但Date#after(Date)
被调用了。我认为实例方法调度总是基于运行时对象。我是否错过了一些愚蠢的事情(很可能)?