Na to vprašanje je dobra razprava o generikih in o tem, kaj v resnici počnejo v ozadju, zato vsi vemo, da je Vector<int[]>
vektor celih števil, HashTable<String, Person>
pa tabela, katere ključi so nizi, vrednosti pa Person
s.
Vendar pa me je zmotila uporaba Class<>
.
Razred java Class
naj bi sprejel tudi ime predloge, (vsaj tako mi govori rumena podčrtanka v Eclipse). Ne razumem, kaj bi moral vnesti tja. Smisel objekta Class
je, kadar nimamo popolnih informacij o objektu, za refleksijo in podobno. Zakaj moram navesti, kateri razred bo vseboval objekt Class
? Očitno ne vem, sicer ne bi uporabljal objekta Class
, ampak bi uporabil specifičnega.
Uporaba generificirane različice razreda Class vam med drugim omogoča, da zapišete stvari, kot so
Class<? extends Collection> someCollectionClass = someMethod();
in potem ste lahko prepričani, da objekt razreda, ki ga prejmete, razširja Razdelek
, in da bo primerek tega razreda (vsaj) zbirka.
Iz dokumentacije Java:
[...] Bolj presenetljivo je, da je bil razred Class generičen. Literali razredov zdaj delujejo kot tipski žetoni in zagotavljajo informacije o tipu tako med izvajanjem kot med sestavljanjem. To omogoča slog statičnih tovarn, ki ga ponazarja metoda getAnnotation v novem vmesniku AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
To je generična metoda. Iz argumenta ugotovi vrednost svojega parametra tipa T in vrne ustrezen primerek T, kot je prikazano v naslednjem odlomku:
Author a = Othello.class.getAnnotation(Author.class);
Pred uvedbo generičnih metod bi morali rezultat pretvoriti v Author. Prav tako ne bi imeli načina, da bi prevajalnik preveril, ali dejanski parameter predstavlja podrazred Annotation. [...]
No, nikoli mi ni bilo treba uporabljati tovrstnih stvari. Kdo?
Pogosto želite uporabiti nadomestne znake z Class
. Na primer, Class<? extends JComponent>
, bi vam omogočilo, da določite, da je razred podrazred JComponent
. Če ste primerek Class
pridobili iz Class.forName
, lahko uporabite Class.asSubclass
, da opravite preslikavo, preden poskusite, recimo, sestaviti primerek.