Er is een goede discussie over Generics en wat ze werkelijk doen achter de schermen op deze vraag, dus we weten allemaal dat Vector<int[]>
een vector van integer arrays is, en HashTable<String, Person>
een tabel is waarvan de sleutels strings zijn en de waarden Personen
.
Wat me echter tegenstaat is het gebruik van Class<>
.
De java class Class
wordt verondersteld ook een template naam te nemen, (of zo wordt mij verteld door de gele onderlijning in eclipse). Ik begrijp niet wat ik daar in moet zetten. Het hele punt van het Class
object is wanneer je niet'de volledige informatie hebt over een object, voor reflectie en dergelijke. Waarom moet ik specificeren welke klasse het Class
object zal bevatten? Ik weet het duidelijk niet, anders zou ik het Class
object niet gebruiken, ik zou het specifieke object gebruiken.
Door de gegenereerde versie van de klasse Class te gebruiken, kunt u, onder andere, dingen schrijven als
Class<? extends Collection> someCollectionClass = someMethod();
en dan weet je zeker dat het Class object dat je ontvangt Collection
uitbreidt, en dat een instantie van deze class (op zijn minst) een Collection zal zijn.
Uit de Java Documentatie:
[...] Nog verrassender is dat de klasse Class is gegenereerd. Class-literals fungeren nu als type-tokens, die zowel run-time als compile-time type-informatie verschaffen. Dit maakt een stijl van statische fabrieken mogelijk die wordt geïllustreerd door de getAnnotation methode in de nieuwe AnnotatedElement interface:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Dit is een generieke methode. Ze leidt de waarde van haar type-parameter T af uit haar argument, en geeft een gepaste instantie van T terug, zoals geïllustreerd wordt door het volgende knipsel:
Author a = Othello.class.getAnnotation(Author.class);
Vóór de generics, zou je het resultaat hebben moeten casten naar Author. Ook zou je geen manier hebben gehad om de compiler te laten controleren dat de werkelijke parameter een subklasse van Annotation vertegenwoordigt. [...]
Nou, ik heb dit soort dingen nooit hoeven te gebruiken. Iemand?
Je wilt vaak jokertekens gebruiken met Class
. Bijvoorbeeld, Class<? extends JComponent>
, zou je toestaan om te specificeren dat de klasse een subklasse is van JComponent
. Als je de Class
instantie uit Class.forName
hebt gehaald, dan kun je Class.asSubclass
gebruiken om de cast te doen voordat je probeert, zeg maar, een instantie te construeren.