Ovsem v bajtkodu se ta informace ve skutecnosti zachova ve forme metadat [...], coz si hlida prekladac ve chvili, kdyz se nekde jinde vola mujObjekt.test1() a mujObjekt.test2().
To je zajimava informace - o jaký přesně metadata se jedná? Jak se to správně jmenuje (abych si o tom mohl něco vygooglit)?
A dá se s těmi metadaty nějak softwarově pracovat? Když např. z nějakého zdroje dostanu obecný objekt a chci za běhu zjistit, jakého je typu, můžu nějak zjistit, jestli je to List<X> nebo List<Y>?
A jak je to s tou (obecnou) factory? Když mu předám obecný objekt, dá se vytvořit nová instance? Jde to nějak přibližně takhle?
Object neznamyObjekt = nepredvidatelnyZdrojObjektu.getNext();
Constructor[] constructors = neznamyObjekt.getClass().getConstructors();
[...výběr bezparametrického konstruktoru...]
Object neznamyObjekt2 = constructor.newInstance();
Co me osobne vadi vice je fakt, ze generika (resp. ty typy) nejsou kovariantni, i kdyz by podle me mohly byt :/
Jak přesně se tohle projevuje? Že List<X> nemůžu předat někam, kde se očekává List? To je asi blbost že? Všechno je to za běhu List. Teď si nějak neumím představit, o co jde

Na druhou stranu je treba diky tomu implementace Clojure pro JVM mnohem snazsi nez v .NET, takze je to neco za neco 
V čem přesně je snazší?
(dík za odpovědi - u většiny z nich bude stačit třeba i jenom nasměrování na článek, vhodnou google frázi nebo tak něco
