( jokeman | 2016. 09. 30., p – 02:29 )

A kettő között azért elég sok különbség van.

Az egyik, hogy mikor/hol dől el a felhasználhatóságra vonatkozó szándék. Javascriptben az objektumot használó (kliens) kód készítőjének a szándéka, hogy egy objektumot "kacsaként" használ, attól függetlenül, hogy az objektum fejlesztője szánta-e ilyen felhasználásra vagy sem. Javában viszont az objektum (pontosabban az ő osztálya) készítője jelezheti (pl. az interface-ekkel), hogy milyen felhasználás(ok)ra szánja az objektumot. Ha nem szánta "kacsának", akkor a kliens nem tudja "kacsaként" kezelni. Hiába "tudja" ugyanis a kliens kód, hogy az objektum interfésze egyébként megfelelne adott elváráshalmaznak (amiket interface-ekkel definiáltunk), magát az objektum típusát a JVM nem engedi olyan interface-re castolni (ClassCastExceptiont eredményez), ami nem volt definiálva az objektum osztályában implements után (beleértve az ősosztályokat is).

Nyilvánvalóan a Reflection API felhasználásával megoldható a tetszőleges metódusok hívogatása, de ez a megoldás ebben az esetben inkább hack. :)

Abban igazad van, hogy persze, egy Java-osztály bármennyi interface-et implementálhat, ezért lehetne olyat csinálni, hogy az osztály fejlesztője minden egyes metódushoz (szélsőségesebb esetben minden egyes overloadhoz) készít egy-egy interface-et is, aztán az osztály meg mindet implementálja. Ez viszont katasztrofális eredményt hozna kódkarbantarthatóság szempontjából, illetve így az egy felelősségi körhöz tartozó metódusok is külön-külön interface-ekben lesznek előírva. (Ha ennek elkerülése érdekében csinálunk összetettebb interface-eket is, amiket az osztály szintén implementál, akkor pedig már ott vagyunk, mint ha normál módon használnánk az interface-eket, csak akkor meg a triviális interface-ek feleslegesek. :) )

Illetve egy hiba: amikor azt írod, hogy "Duck typing-gal azt mondjuk, hogy futasidoben ez a fuggveny ilyen es olyan metodusokkal es/vagy propertykkel kell rendelkezzen", akkor ott szerintem arra gondolsz, hogy "Duck typing-gal azt mondjuk, hogy futasidoben ez az objektum ilyen es olyan metodusokkal es/vagy propertykkel kell rendelkezzen".