What is this weird dynamic method dispatch behavior inside a static method in Java -
this question has answer here:
the utility method in below example illustration purposes only.
in example below, instance method invocation dispatched reference type not run-time object.
import java.sql.timestamp; import java.util.date; public class dynamicmethoddispatchex {      public static void main(string[] args) {         timestamp = new timestamp(system.currenttimemillis());         timestamp beforenow = new timestamp(now.gettime() - 1);          system.out.println("finding newest in " + + " , " + 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;         }     }  }   the below output got
finding newest in 2016-08-23 17:56:36.375 , 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 // <---   after investigation, found out java.util.date.after(date) being invoked in staticfindnewer() , discrepancy in attempt 1 , 2 , due precision loss date's methods being used.
however, i'm puzzled dynamic dispatch. i expected timestamp#after(timestamp) invoked date#after(date) getting invoked. thought instance-method dispatch based on runtime object. missing silly (most probably)? 
i expected
timestamp#after(timestamp)invokeddate#after(date)getting invoked. thought instance-method dispatch based on runtime object.
dynamic dispatch happens on invoked object, not on arguments.
so call go timestamp#after(date) (because compile-time type of argument date, , runtime type of callee timestamp). 
unfortunately, timestamp not override method, defaults date#after(date) (which not work here).
so have make sure call timestamp#after(timestamp) directly, or use date#compareto(date) method instead, implemented (and overridden in timestamp).
Comments
Post a Comment