【发布时间】:2016-08-24 01:04:12
【问题描述】:
以下示例中的实用程序方法仅用于说明目的。
在下面的示例中,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 // <---
经过一番调查,我发现staticFindNewer() 中调用了java.util.Date.after(Date),而尝试1 和2 的差异是由于使用Date 的方法导致精度损失。
但是,我对动态调度感到困惑。 我希望Timestamp#after(Timestamp) 被调用,但Date#after(Date) 被调用。我认为实例方法调度总是基于运行时对象。我是否错过了一些愚蠢的事情(很可能)?
【问题讨论】:
-
我不明白你的问题。你有什么困惑?假设你指的是
java.sql.Timestamp,那是java.util.Date的子类型 -
@SotiriosDelimanolis 我期待
one.after(two)被发送到 java.sql.Timestamp 但它被发送到java.util.Date -
您的意思是您希望调用
Timestamp#after(Timestamp)而不是Date#after(Date)?请将其编辑到您的问题中。 -
@SotiriosDelimanolis 更新了问题。谢谢。
-
两个对象都是
Timestamp对象 - 但是方法的参数类型是在编译时确定的。在这种情况下,您的静态方法接受Date,因此它使用它。
标签: java dynamic-dispatch