Det' s en god diskusjon av Generics og hva de egentlig gjør bak kulissene over på dette spørsmålet, så vi vet alle at Vector<int[]>
er en vektor av heltall arrays, og HashTable<String, Person>
er en tabell av hvis nøkler er strenger og verdier Person
s.
Det som imidlertid stusser meg er bruken av Class<>
.
Java-klassen Class
skal også ta et malnavn, (eller så blir jeg fortalt av den gule understrekingen i eclipse). Jeg forstår ikke hva jeg skal legge inn der. Hele poenget med Klasse
-objektet er når du ikke har fullstendig informasjon om et objekt, for refleksjon og slikt. Hvorfor får det meg til å spesifisere hvilken klasse Klasse
-objektet skal inneholde? Jeg vet tydeligvis ikke, ellers ville jeg ikke brukt Klasse
-objektet, jeg ville brukt det spesifikke.
Ved å bruke den genererte versjonen av klassen Class kan du blant annet skrive ting som
Class<? extends Collection> someCollectionClass = someMethod();
og da kan du være sikker på at Class-objektet du mottar utvider Collection
, og en forekomst av denne klassen vil være (minst) en Collection.
Fra Java-dokumentasjonen:
[...] Mer overraskende har klassen Class blitt generifisert. Klasseliteraler fungerer nå som type tokens, og gir både kjøretid og kompileringstypeinformasjon. Dette muliggjør en stil av statiske fabrikker eksemplifisert ved getAnnotation-metoden i det nye AnnotatedElement-grensesnittet:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Dette er en generisk metode. Den utleder verdien av typeparameteren T fra argumentet, og returnerer en passende forekomst av T, som illustrert av følgende utdrag:
Author a = Othello.class.getAnnotation(Author.class);
Før generics måtte du ha kastet resultatet til Author. Du ville heller ikke hatt noen måte å få kompilatoren til å sjekke at den faktiske parameteren representerte en underklasse av Annotation. [...]
Vel, jeg trengte aldri å bruke denne typen ting. Noen som har det?
Du vil ofte bruke jokertegn med Klasse
. For eksempel vil Class<? extends JComponent>
, tillate deg å spesifisere at klassen er en underklasse av JComponent
. Hvis du har hentet Class
-instansen fra Class.forName
, kan du bruke Class.asSubclass
til å gjøre castingen før du for eksempel prøver å konstruere en instans.