Friday, August 10, 2007

most specific signature wins#Onion,covariant,subsume

(My most advanced java OO post to date)

Q: LoginAction.java execute(HttpRequest req, HttpResponse res, ActionMapping m, supertypeOfActionForm f) allowed?
A: allowed but after lots of research still not sure if this is overriding or overloading.

http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/915D0C58-87BE-46B4-893A-42CFCA08A717/0/lec14.pdf

    2. Each method in subtype that corresponds to one in the supertype:
    requires less (has a weaker precondition)
    • there are no more "requires" clauses, and each one is no more strict than the one in the supertype method.
    • 2.1) the argument types may be supertypes of the ones in the supertype. This is called contravariance, and it feels somewhat backward, because the arguments to the subtype method are supertypes of the arguments to the supertype method. However, it makes sense, because any arguments passed to the supertype method are sure to be legal arguments to the subtype method.

    guarantees more (has a stronger postcondition)
    • there are no more exceptions %% a kind of guarantee
    • the result type may be a subtype of that of the supertype. This is called covariance: the return type of the subtype method is a subtype of the return type of the supertype method.

    Example: If A is a subtype of B, then the following would be a legal overriding: %% overloading
    Bicycle B.f(Bicycle arg); %% abstract -> compile error
    RacingBicycle A.f(Vehicle arg);
    Method B.f takes a Bicycle as its argument, but A.f can accept any Vehicle (which includes all Bicycles). Method B.f returns a Bicycle as its result, but A.f returns a RacingBicycle (which is itself a Bicycle).
In this example, subtype A satisfies IS-A, even though we question overloading vs overriding. A.f() supports the expected service. I verified this set-up in NextGen. Compiled OK. However, P 44 and P6 [[ java precisely ]] introduced the concept of subsumption and "most specific signature". Based on my understanding, the baseclass execute() is more specific => takes precedence at compile-time method binding

The Onion rules of runtime binding apply when the overriding and overriden signatures are equally specific ie the declared argument types are 100% identical.

http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Java has a concise statement -- "Parameter types have to be exactly the same (invariant) for method overriding, otherwise the method is overloaded with a parallel definition instead."

Notice the title says "most specific signature" instead of "signatureS"? There's always a single "most specific signature", possibly implemented by multiple ancestors/descendants on the inheritance tree. Look at hashCode(), equals() and toString().

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States
http://www.linkedin.com/in/tanbin