java generics tutorial with examples
Java Generics zijn een set functies waarmee u code kunt schrijven, onafhankelijk van het gegevenstype. In dit artikel wordt Java Generics gedetailleerd uitgelegd met voorbeelden:
Generics zijn een van de belangrijkste kenmerken van Java en zijn vanaf Java 5 geïntroduceerd.
Per definitie zijn Generics een set Java-taalfuncties waarmee de programmeur Generic-typen en -functies kan gebruiken en zo typeveiligheid kan garanderen.
Wat je leert:
Hoe werken generieke geneesmiddelen in Java?
Als je eerder met C ++ hebt gewerkt, dan is Java Generics hetzelfde als sjablonen in C ++. Met Java Generics kunt u een parameter in uw klasse / methode-definitie opnemen die de waarde heeft van een primitief gegevenstype.
Bijvoorbeeld, u kunt als volgt een generieke klasse 'Array' hebben:
Klasse-array {….}
Waar is het geparametriseerde type.
Vervolgens kunt u als volgt objecten voor deze klasse maken:
Dus gegeven een Generic geparametriseerde klasse, kunt u objecten van dezelfde klasse maken met verschillende gegevenstypen als parameters. Dit is de belangrijkste essentie van het gebruik van Java Generics.
Evenzo kunt u een generieke methode schrijven met een geparametriseerd type voor het sorteren van een array en deze methode vervolgens instantiëren naar elk primitief type.
Java Generics worden meestal gebruikt met het verzamelingsraamwerk van Java. De verschillende collecties zoals LinkedList, List, Map, HashMap, etc. gebruiken Generics voor implementatie. Generics bieden typeveiligheid, aangezien de typecontrole wordt uitgevoerd tijdens het compileren, waardoor uw code stabieler wordt.
Laten we nu dieper ingaan op de details van generieke klassen en methoden, evenals andere gerelateerde onderwerpen.
Generieke klassen
Een generieke klasse is hetzelfde als een normale klasse, behalve dat de klassenaam wordt gevolgd door een type tussen haakjes.
Een algemene definitie van een generieke klasse is als volgt:
class class_name
klassenvariabelen;
klasse methoden;
Nadat de klasse is gedefinieerd, kunt u als volgt objecten van elk gegevenstype maken:
Bijvoorbeeld, voor Integer-object zal de declaratie zijn:
Evenzo is het object voor het gegevenstype String:
Een voorbeeldimplementatie voor de klasse Generic wordt hieronder weergegeven.
Uitgang:
In het bovenstaande programma is een klasse MyGenericClass een generieke klasse. Het heeft twee methoden, namelijk toevoegen en krijgen. De methode add initialiseert het generieke object terwijl de get-methoden het object retourneren.
In de hoofdfunctie declareren we elk twee objecten van het type Integer en String. We initialiseren beide objecten met hun respectievelijke beginwaarden met behulp van de add-methode en voeren vervolgens de inhoud van deze objecten uit met behulp van de get-methode.
We hebben het algemene klassevoorbeeld hierboven gepresenteerd met één typeparameter. Maar in werkelijkheid kan een klasse ook meer dan één typeparameter hebben. In dit geval worden de typeparameters gescheiden door een komma.
Het volgende voorbeeld laat dit zien:
Uitgang:
In dit programma hebben we twee typeparameters, namelijk T1 en T2. We hebben functies om de lidobjecten te initialiseren en ook om de inhoud af te drukken. In de hoofdfunctie declareren we een object met twee typen, namelijk String en Integer. De uitvoer van het programma toont de inhoud van het gemaakte object.
Net als klassen kunt u ook generieke interfaces hebben. We zullen alles over interfaces leren in een apart onderwerp.
Algemene Java-methoden
Net zoals u generieke klassen en interfaces kunt hebben, kunt u ook generieke methoden hebben voor het geval u niet een hele klasse nodig heeft om generiek te zijn.
Het volgende programma toont de implementatie van de generieke methode “printGenericArray”. Let op de methodeaanroep in de hoofdfunctie. Hier doen we twee aanroepen naar de Generic-methode, eerst met type en vervolgens met type.
Uitgang:
Begrensde typeparameters
Bounded Type Parameters komen in beeld wanneer u de gegevenstypen in Generics wilt beperken. Bijvoorbeeld, als je een bepaalde generieke klasse of methode of een andere interface wilt die alleen voor numerieke gegevenstypen zou moeten werken, dan kun je dat specificeren met het trefwoord 'extends'.
Dit wordt hieronder weergegeven:
De bovenstaande twee declaraties worden door de compiler geaccepteerd, aangezien Long en Integer subklassen van Number zijn.
De volgende aangifte wordt echter een probleem.
Dit geeft een compilatietijdfout omdat String geen getal is. Het symbool ‘?’ In het bovenstaande voorbeeld staat bekend als een jokerteken en we zullen het hierna bespreken.
Dus in het algemeen worden parameters van begrensde typen meestal gebruikt als u de gegevenstypen wilt beperken die in uw generieke code moeten worden gebruikt.
Java Generics Wildcard
In Java wordt een jokerteken aangeduid met een vraagteken, ‘?’, Dat wordt gebruikt om naar een onbekend type te verwijzen. Jokertekens worden meestal gebruikt met generieke geneesmiddelen als parametertype.
Wanneer u generieke jokertekens gebruikt, moet u een punt onthouden dat, hoewel het object de superklasse is van alle andere klassen, de verzameling objecten ( Bijvoorbeeld, List) is geen superklasse van alle andere collecties.
Behalve dat het wordt gebruikt als een parametertype, kunt u een jokerteken gebruiken als een veld, een lokale variabele en als zodanig. U kunt echter nooit een jokerteken gebruiken als supertype, of als type-argument om een generieke methode aan te roepen of bij het maken van een instantie van een generieke klasse.
Er zijn veel voorbeelden van typen met jokertekens met parameters (hier is ten minste één type-argument een jokerteken) zoals hieronder weergegeven en de jokertekens die op verschillende plaatsen worden gebruikt, worden anders geïnterpreteerd:
- Verzameling <: Verzameling geeft alle instantiatie van de verzamelingsinterface aan, ongeacht het gebruikte type-argument.
- Lijst extends Number< : Lijst vertegenwoordigt alle lijsttypen waarbij het elementtype een getal zal zijn.
- Comparator: Alle vergelijkende interface-instantiaties voor type-argumenten die Stringsupertypes zijn.
Merk op dat een type met jokertekens met parameters een regel is die wordt opgelegd om geldige typen te herkennen. Het is geen concreet gegevenstype. Generieke jokertekens kunnen begrensd of onbegrensd zijn.
# 1) Onbeperkte jokertekens
In Unbounded Wildcards zijn er geen beperkingen voor typevariabelen en wordt als volgt aangegeven:
# 2) Begrensde jokertekens
We hebben al begrensde typen besproken. Deze zetten de beperkingen op het datatype dat wordt gebruikt om de typeparameters te instantiëren met behulp van de trefwoorden - extends of super. Deze jokertekens kunnen verder worden onderverdeeld in Upper Bounded Wildcards en Lower Bounded Wildcards.
- Bovengrens jokertekens
Als u wilt dat uw generieke uitdrukking geldig is voor alle subklassen van een bepaald type, specificeert u het bovenste jokerteken met het trefwoord extends.
Bijvoorbeeld, stel dat u een generieke methode nodig heeft die List, List, etc. ondersteunt, dan kunt u een Upper Bounded Wildcard specificeren zoals Lijst Aangezien Number een superklasse is, werkt deze generieke methode voor al zijn subklassen.
Het volgende programma laat dit zien.
Uitgang:
Hier hebben we een jokerteken voor de bovengrens opgegeven, Lijst met het type argument van de functie “sommatie”. In de hoofdfunctie definiëren we twee lijsten, d.w.z. int_list van het type Integer en doubles_list van het type Double. Aangezien Integer en Double de subklassen van Getallen zijn, werkt de functie-optelling perfect op beide lijsten.
gratis versiebeheersoftware voor Windows
- Lower Bounded Wildcards
Als u wilt dat de generieke uitdrukking alle superklassen van een bepaald type accepteert, kunt u een ondergrens jokerteken specificeren voor uw type-argument.
Een voorbeeldimplementatie hiervoor wordt hieronder gegeven:
Uitgang:
In dit programma is de opgegeven Lower Bounded Wildcard 'List'. Dan hebben we in de hoofdfunctie een typelijst en de lijst. Omdat we de Lower Bounded Wildcard hebben gebruikt, is de Number-klasse een superklasse van Integer is een geldig type-argument.
Voordelen van Java Generics
# 1) Type veiligheid
Generics zorgen voor typeveiligheid. Dit betekent dat typecontrole wordt uitgevoerd tijdens het compileren in plaats van tijdens de uitvoering. Er is dus geen kans om “ClassCastException” te krijgen tijdens runtime, aangezien de juiste typen worden gebruikt.
In het bovenstaande programma hebben we twee lijsten, een zonder generieke geneesmiddelen en een andere met generieke geneesmiddelen. In de niet-generieke lijst staat geen typeveiligheid. U kunt een geheel getal, tekenreeks, enz. Als element toevoegen en het wordt geaccepteerd.
In de algemene lijst kunt u slechts één type element toevoegen dat is opgegeven in de generieke uitdrukking. Als u probeert een element van een ander type toe te voegen, resulteert dit in een compilatiefout.
In het bovenstaande programma wordt de compilatietijdfout geflitst op de regel:
# 2) Herbruikbaarheid van code
Als u Generics gebruikt, hoeft u geen aparte code voor elk datatype te schrijven. U kunt een enkele klasse of methode enz. Schrijven en deze voor alle gegevenstypen gebruiken.
# 3) Typecasting is niet nodig
Omdat u Generics gebruikt, kent de compiler de gebruikte typen, en is typecasting niet nodig.
Beschouw de onderstaande code:
Zoals je kunt zien wanneer een normale lijst wordt gebruikt, moet je het lijstelement naar het juiste type typen, zoals het wordt gedaan voor de bovenstaande mystr.
Laten we nu dezelfde code opnieuw schrijven met een generieke lijst.
Hier hebben we het stringtype gespecificeerd als een generieke uitdrukking voor de lijstverklaring. Om afzonderlijke elementen van deze lijst op te halen, hoeven we dus niet te typen.
# 4) Implementeer generieke algoritmen
U kunt veel meer generieke algoritmen implementeren als u Generics gebruikt om te coderen.
# 5) Compilatietijdcontrole
Zoals reeds vermeld, controleert de compiler, wanneer u Generics in uw Java-programma gebruikt, de typen tijdens het compileren, waardoor abnormale beëindiging van het programma tijdens runtime wordt voorkomen.
Veel Gestelde Vragen
V # 1) Waarom gebruiken we Generics in Java?
Antwoord: Generieke gegevens zorgen voor typeonafhankelijkheid, d.w.z. we kunnen een typeparameter opgeven tijdens het definiëren van een klasse / interface / methode enz. Zodat we tijdens de feitelijke instantiatie het werkelijke type kunnen specificeren. Op deze manier zorgen we ook voor herbruikbaarheid van code.
Vraag 2) Zijn generieke geneesmiddelen belangrijk in Java?
Antwoord: Ja. Generieke gegevens zijn in feite de belangrijkste kenmerken van Java om typeveiligheid te garanderen, d.w.z. typecontrole tijdens het compileren.
V # 3) Wanneer heeft Java Generics toegevoegd?
Antwoord: Generics werden in 2004 aan Java toegevoegd met J2SE 5.0 met de bedoeling om de veiligheid van het compilatietype in Java te waarborgen.
V # 4) Wat is een generiek type?
Antwoord: Een generiek type is een generieke klasse, interface of methode die is voorzien van een typeparameter. Dit maakt typeveiligheid en hergebruik van code mogelijk.
V # 5) Kunnen we Generics gebruiken met Array in Java?
Antwoord: Nee. Java staat geen generieke arrays toe.
Gevolgtrekking
Hiermee is de tutorial over Java-generieken afgerond, die wordt beschouwd als een van de belangrijkste functies in recente Java-versies. Het gebruik van Generics in Java-programma's zorgt voor typeveiligheid en hergebruik van code. Het zorgt ook voor controle tijdens het compileren, zodat het programma niet kapot gaat tijdens runtime.
Java-generieke geneesmiddelen zijn vooral handig met de Java-verzamelingsinterface die we in een andere tutorial in deze serie in detail zullen bespreken.
Veel leesplezier !!
Aanbevolen literatuur
- 15 beste JAVA-tools voor ontwikkeling, build, profiler, codedekking en beoordeling
- Zelfstudie voor Java Collections Framework (JCF)
- Java DataTypes, Loops, Arrays, Switch en Assertions
- Java-implementatie: creatie en uitvoering van Java JAR-bestand
- Java-uitzonderingen en het afhandelen van uitzonderingen met voorbeelden
- JAVA-zelfstudie voor beginners: 100+ praktische Java-videotutorials
- Zelfstudie over reflectie in Java met voorbeelden
- Java 'dit' trefwoord: zelfstudie met codevoorbeelden