1

以下の例のユーティリティ メソッドは、説明のみを目的としています。

以下の例では、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 // <---

調査の結果、java.util.Date.after(Date)が呼び出され、staticFindNewer()試行 1 と 2 で不一致が発生し、Date のメソッドが使用されていたため、精度が低下したことが原因であることがわかりました。

ただし、動的ディスパッチについては戸惑います。Timestamp#after(Timestamp)は呼び出されると思っていましたDate#after(Date)が、呼び出されていました。インスタンスメソッドのディスパッチは常にランタイムオブジェクトに基づいていると思いました。私は何かばかげたことを見逃していますか(おそらく)?

4

1 に答える 1