Java Generics is een van de belangrijkste kenmerken van de Java-taal. Het idee achter generics is vrij eenvoudig, maar soms komt het uit als complex vanwege de verschuiving van de gebruikelijke syntaxis geassocieerd met het.
het doel van deze handleiding is om u kennis te laten maken met dit nuttige concept van generieke geneesmiddelen op een gemakkelijk te begrijpen manier.
maar voordat we in de generica zelf duiken, laten we uitzoeken waarom Java generics in de eerste plaats nodig waren.,
doel van Java Generics
voor de introductie van generics in Java 5, kunt u een codefragment schrijven en compileren zonder een fout of waarschuwing te geven:
u kunt waarden van elk type toevoegen aan een lijst of een andere Java-verzameling zonder te hoeven aangeven welk type gegevens het opslaat. Maar als je waarden uit de lijst haalt, moet je het expliciet naar een bepaald type casten.
overweeg om de bovenstaande lijst te herhalen.,
toestaan van het aanmaken van een lijst zonder eerst het opgeslagen gegevenstype te declareren, zoals wij deden, kan ertoe leiden dat programmeurs fouten maken zoals hierboven die ClassCastExceptions
tijdens de runtime gooit.
Generics werden geïntroduceerd om te voorkomen dat programmeurs dergelijke fouten maken.
met generics kunt u het gegevenstype dat wordt opgeslagen bij het maken van een Java-collectie expliciet declareren, zoals het volgende voorbeeld laat zien.,
nu kunt u niet per ongeluk een geheel getal opslaan in een String type lijst zonder een compilatie-tijd fout te geven. Dit zorgt ervoor dat uw programma niet loopt in runtime fouten.
het belangrijkste doel van de introductie van generics in Java was om te voorkomen dat ClassCastExceptions
tijdens runtime tegenkwam.
Java Generics aanmaken
u kunt generics gebruiken om Java-klassen en-methoden te maken., Laten we eens kijken naar de voorbeelden van het maken van generica van elk type.
Generieke Klasse
bij het maken van een generieke klasse wordt de typeparameter voor de klasse toegevoegd aan het einde van de klassenaam binnen hoek <>
haakjes.
Hier is T
de parameter van het gegevenstype. T
, N
, en E
zijn enkele van de letters die gebruikt worden voor data type parameters volgens Java conventies.,
in het bovenstaande voorbeeld kunt u een specifiek gegevenstype doorgeven wanneer u een object GenericClass maakt.
u kunt een primitief gegevenstype niet doorgeven aan de parameter gegevenstype bij het maken van een generiek klasseobject. Alleen gegevenstypen die het objecttype uitbreiden, kunnen als typeparameters worden doorgegeven.
bijvoorbeeld:
Generieke methoden
het maken van generieke methoden volgt een vergelijkbaar patroon als het maken van generieke klassen. U kunt een generieke methode implementeren binnen een generieke klasse en een niet-generieke.,
Hier kunt u een array van een specifiek type doorgeven om de methode te parametreren. De generieke methode PrintItems()
itereert door de doorgegeven array en drukt de opgeslagen items af als een normale Java-methode.
begrensde Typeparameters
tot nu toe kunnen de generieke klassen en methoden die we hierboven hebben gemaakt, worden geparametreerd naar elk ander gegevenstype dan primitieve typen. Maar wat als we de gegevenstypen die kunnen worden doorgegeven aan generieke geneesmiddelen willen beperken? Dit is waar begrensde type parameters komen in.,
u kunt de gegevenstypen die door een generieke klasse of methode worden geaccepteerd, binden door op te geven dat het een subklasse van een ander gegevenstype moet zijn.
bijvoorbeeld:
hier kan het UpperBoundedClass
en UpperBoundedMethod
alleen worden geparametreerd met behulp van subtypes van het List
gegevenstype.
List
gegevenstype fungeert als een bovengrens voor de parameter type. Als u een gegevenstype probeert te gebruiken dat geen subtype is van List
, zal er een compilatie-tijdfout ontstaan.
de grenzen zijn niet beperkt tot alleen klassen., U kunt ook interfaces passeren. Het uitbreiden van de interface betekent in dit geval het implementeren van de interface.
een parameter kan ook meerdere grenzen hebben zoals dit voorbeeld laat zien.
het aanvaarde gegevenstype moet een subklasse van zowel dier-als Zoogdierklassen zijn. Als een van deze grenzen een klasse is, moet deze op de eerste plaats komen in de gebonden verklaring.
in het bovenstaande voorbeeld, als zoogdier een klasse is en dier een interface is, moet zoogdier eerst komen zoals hierboven getoond. Anders, de code gooit een compile-time fout.,
Java Generics jokertekens
jokertekens worden gebruikt om parameters van generieke types door te geven aan methoden. In tegenstelling tot een generieke methode wordt hier de generieke parameter doorgegeven aan de parameters die door de methode worden geaccepteerd, wat verschilt van de parameter van het gegevenstype die we hierboven hebben besproken. Een joker wordt weergegeven door de ? symbool.
de bovenstaande printItems()
methode accepteert lijsten van elk gegevenstype als parameter. Dit voorkomt dat programmeurs codes moeten herhalen voor lijsten van verschillende gegevenstypen, wat zonder generica het geval zou zijn.,
Upper Bounded jokertekens
als we de gegevenstypen willen beperken die zijn opgeslagen in de lijst die met deze methode wordt geaccepteerd, Kunnen we bounded jokertekens gebruiken.
voorbeeld:
printSubTypes()
methode accepteert alleen de lijsten die subtypes van kleur opslaan. Het accepteert een lijst van rode of blauwe kleur objecten, maar accepteert geen lijst van dierlijke objecten. Dit komt omdat dier geen subtype van kleur is. Dit is een voorbeeld van een upper-bounded wildcard.,
Lower Bounded jokertekens
Evenzo, als we hadden:
dan accepteert de methode printSuperTypes()
alleen lijsten die supertypen van de Hondenklasse opslaan. Het zou een lijst van zoogdieren of dieren objecten te accepteren, maar niet een lijst van LabDog objecten omdat LabDog is geen superklasse van de hond, maar een subklasse. Dit is een voorbeeld van een Lower-bounded Joker.
conclusie
Java Generics is een eigenschap geworden waar programmeurs sinds de introductie niet meer zonder kunnen.
deze populariteit is te wijten aan de impact ervan op het gemakkelijker maken van het leven van programmeurs., Naast het voorkomen dat ze coderingsfouten maken, maakt het gebruik van generieke geneesmiddelen de code minder repetitief. Heb je gemerkt hoe het generaliseert klassen en methoden om te voorkomen dat code te herhalen voor verschillende gegevenstypen?
een goede kennis van generieke geneesmiddelen is belangrijk om een expert in de taal te worden. Dus, het toepassen van wat je hebt geleerd in deze tutorial in praktische code is de manier om nu verder te gaan.