Java Generics Voorbeeld Tutorial – Generic Method, Class, Interface
Java Genrics is een van de belangrijkste functies die in Java 5 zijn geïntroduceerd.
Als je aan Java Collections hebt gewerkt en met versie 5 of hoger, weet ik zeker dat je het hebt gebruikt.
Generieke gegevens in Java met verzamelingsklassen is heel eenvoudig, maar het biedt veel meer mogelijkheden dan alleen het maken van de type collectie.
In dit artikel zullen we proberen de kenmerken van generieke geneesmiddelen te leren. Het begrijpen van generieke geneesmiddelen kan soms verwarrend zijn als we jargonwoorden gebruiken, dus ik zou proberen het simpel en gemakkelijk te begrijpen te houden.
Generics in Java
Generics is toegevoegd in Java 5 om typecontrole tijdens het compileren mogelijk te maken en het risico van ClassCastException
dat vaak voorkwam tijdens het werken te verwijderen met collectieklassen. Het hele verzamelingsraamwerk is herschreven om generieke middelen te gebruiken voor typeveiligheid. Laten we eens kijken hoe generieke geneesmiddelen ons helpen om verzamelklassen veilig te gebruiken.
Bovenstaande code compileert prima, maar gooit ClassCastException tijdens runtime omdat we proberen Object in de lijst naar String te casten, terwijl een van de elementen van het type Integer is. Na Java 5 gebruiken we verzamelklassen zoals hieronder.
Merk op dat we op het moment van het maken van de lijst hebben gespecificeerd dat het type elementen in de lijst String zal zijn. Dus als we proberen om een ander type object aan de lijst toe te voegen, zal het programma een compilatiefout genereren. Merk ook op dat we in de for-lus geen typecasting van het element in de lijst nodig hebben, en daarom de ClassCastException tijdens runtime verwijderen.
Java Generic Class
We kunnen onze eigen klassen definiëren met generiek type. Een generiek type is een klasse of interface die is geparametriseerd over typen. We gebruiken punthaken (< >) om de parameter type te specificeren.
Om het voordeel te begrijpen, laten we zeggen we hebben een eenvoudige klasse als:
Merk op dat tijdens het gebruik van deze klasse, we type casting moeten gebruiken en het kan ClassCastException produceren tijdens runtime. Nu zullen we de generieke klasse van Java gebruiken om dezelfde klasse te herschrijven zoals hieronder wordt weergegeven.
Let op het gebruik van de klasse GenericsType in de hoofdmethode. We hoeven geen type-casting uit te voeren en we kunnen ClassCastException tijdens runtime verwijderen. Als we het type niet opgeven op het moment van maken, zal de compiler een waarschuwing geven dat “GenericsType een onbewerkt type is.
Verwijzingen naar generiek type GenericsType < T > moet worden geparametriseerd “. Als we het type niet opgeven, wordt het type Object
en staat het dus beide String en Integer-objecten. Maar we moeten dit altijd proberen te vermijden, omdat we typecasting moeten gebruiken terwijl we aan onbewerkte typen werken die runtime-fouten kunnen veroorzaken.
Merk ook op dat het java autoboxing ondersteunt.
Java Generic Interface
Een vergelijkbare interface is een goed voorbeeld van Generics in interfaces en het is geschreven als:
Op een vergelijkbare manier kunnen we generieke interfaces maken in Java. We kunnen ook hebben meerdere typeparameters zoals in de kaartinterface gain kunnen we ook een geparametriseerde waarde geven aan een geparametriseerd type, bijvoorbeeld new HashMap<String, List<String>>();
is geldig.
Java Generic Type
Java Generic Type Naming conventie helpt ons code gemakkelijk te begrijpen en het hebben van een naamgevingsconventie is een van de best practices van Java-programmeertaal. Generieke geneesmiddelen hebben dus ook hun eigen naamgevingsconventies. Typeparameternamen zijn meestal enkele hoofdletters, zodat ze gemakkelijk te onderscheiden zijn van java-variabelen. De meest gebruikte parameternamen van typen zijn:
- E – Element (uitgebreid gebruikt door het Java Collections Framework, bijvoorbeeld ArrayList, Set etc.)
- K – Key ( Gebruikt op kaart)
- N – nummer
- T – type
- V – waarde (gebruikt op kaart)
- S, U, V etc. – 2e, 3e, 4e type
Java Generic Method
Soms willen we niet dat de hele klasse wordt geparametriseerd, in dat geval kunnen we create java generics-methode. Aangezien de constructor een speciaal soort methode is, kunnen we generieke typen ook in constructors gebruiken.
Hier is een klasse die een voorbeeld toont van een generieke Java-methode.
Let op de isEqual-methode handtekening met syntaxis om generieke typen in methoden te gebruiken. Merk ook op hoe u deze methoden kunt gebruiken in ons Java-programma. We kunnen het type specificeren tijdens het aanroepen van deze methoden of we kunnen ze aanroepen als een normale methode. Java-compiler is slim genoeg om te bepalen welk type variabele moet worden gebruikt, deze faciliteit wordt type-inferentie genoemd.
Java Generics Bounded Type Parameters
Stel dat we het type objecten willen beperken dat kan worden gebruikt in het geparametriseerde type, bijvoorbeeld in een methode die twee objecten vergelijkt en we willen zorg ervoor dat de geaccepteerde objecten Vergelijkbaar zijn. Om een begrensde typeparameter te declareren, vermeldt u de naam van de typeparameter, gevolgd door het trefwoord extends, gevolgd door de bovengrens, vergelijkbaar met de onderstaande methode.
De het aanroepen van deze methoden is vergelijkbaar met de onbegrensde methode, behalve dat als we een klasse proberen te gebruiken die niet vergelijkbaar is, dit een compilatietijdfout veroorzaakt.
Parameters van het begrensde type kunnen zowel met methoden als met klassen en interfaces.
Java Generics ondersteunt ook meerdere grenzen, dwz < T verlengt A & B & C >. In dit geval kan A een interface of klasse zijn. Als A een klasse is, moeten B en C een interface zijn. We kunnen niet meer dan één klasse in meerdere grenzen hebben.
Java Generics and Inheritance
Dat weten we Java-overerving stelt ons in staat om een variabele A toe te wijzen aan een andere variabele B als A een subklasse van B is. Dus we zouden kunnen denken dat elk generiek type A kan worden toegewezen aan generiek type B, maar dat is niet het geval. Laten we dit eens bekijken met een eenvoudig programma.
We mogen MyClass < String > variabele niet toewijzen aan MyClass < Object > variabele omdat ze niet gerelateerd zijn, in feite MyClass < T > parent is Object.
Java Generic Classes and Subtyping
We kunnen een generieke klasse of interface subtypen door deze uit te breiden of te implementeren. De relatie tussen de type parameters van de ene klasse of interface en de type parameters van een andere wordt bepaald door de extends en implementeert clausules.
De subtyping-relatie blijft behouden zolang we het type-argument niet veranderen, hieronder ziet u een voorbeeld van meerdere typeparameters.
De subtypen van List < String > kan MyList < String, Object >, MyList < String, Integer > enzovoort.
Java Generics Wildcards
Vraagteken (?) Is het jokerteken in generieke termen en vertegenwoordigt een onbekend type. Het jokerteken kan worden gebruikt als het type parameter, veld of lokale variabele en soms als retourtype. We kunnen geen jokertekens gebruiken bij het aanroepen van een generieke methode of het instantiëren van een generieke klasse. In de volgende secties zullen we leren over jokertekens aan de bovengrens, jokertekens met ondergrens en het vastleggen van jokertekens.
9.1) Java Generics Bovengrens jokertekens
Bovengrens jokertekens worden gebruikt om de beperking van het type variabele in een methode. Stel dat we een methode willen schrijven die de som van de getallen in de lijst retourneert, dus onze implementatie zal er ongeveer zo uitzien.
Nu het probleem met bovenstaande implementatie is dat het niet zal werken met lijst met gehele getallen of dubbels omdat we weten dat List < Integer > en List < Dubbel > zijn niet gerelateerd, dit is wanneer een jokerteken met bovengrens nuttig is. We gebruiken generieke jokertekens met het trefwoord extends en de bovengrensklasse of interface waarmee we het argument van de bovengrens of zijn subklassetypes kunnen doorgeven.
De bovenstaande implementatie kan worden gewijzigd zoals het onderstaande programma.
Het is vergelijkbaar met het schrijven van onze code in termen van interface, in de bovenstaande methode kunnen we alle methoden van bovengrens class Number gebruiken. Merk op dat we met een bovengrenslijst geen enkel object aan de lijst mogen toevoegen behalve null. Als we proberen een element aan de lijst toe te voegen binnen de som-methode, zal het programma niet compileren.
9.2) Java Generics Unbounded Wildcard
Soms hebben we een situatie waarin we willen dat onze generieke methode werkt met alle typen, in dit geval kan een onbegrensd jokerteken worden gebruikt. Het is hetzelfde als het gebruik van <? verlengt Object >.
We kunnen een lijst leveren < String > of List < Geheel getal > of een ander type objectlijstargument voor de printData methode. Net als bij een bovengrenslijst, mogen we niets aan de lijst toevoegen.
9.3) Java Generics Lower bounded Wildcard
Stel dat we gehele getallen willen toevoegen aan een lijst met gehele getallen in een methode, dan kunnen we het argumenttype behouden als List < Integer > maar het zal worden gekoppeld aan gehele getallen terwijl List < Number > en List < Object > kan ook gehele getallen bevatten, dus we kunnen een ondergrens jokerteken gebruiken om dit te bereiken. We gebruiken generieke jokertekens (?) Met super trefwoord en ondergrensklasse om dit te bereiken.
We kunnen ondergrens of elk supertype van ondergrens als argument doorgeven, in dit geval staat de java-compiler toe om lagere gebonden objecttypen aan de lijst.
Subtypen met Generics Wildcard
Java Generics Type Erasure
Generics in Java is toegevoegd om typecontrole tijdens het compileren mogelijk te maken en het heeft geen zin tijdens runtime, dus de java-compiler gebruikt de functie voor het wissen van typen om alle generieke typecontrolecode in bytecode te verwijderen en indien nodig typecasting in te voegen. Type wissen zorgt ervoor dat er geen nieuwe klassen worden aangemaakt voor geparametriseerde typen; bijgevolg hebben generieke geneesmiddelen geen runtime-overhead.
Bijvoorbeeld, als we een generieke klasse hebben zoals hieronder;
De Java-compiler vervangt de parameter T van het begrensde type door de eerste gebonden interface, Vergelijkbaar , zoals onderstaande code:
Generics FAQs
12.1) Waarom gebruiken we Generics in Java?
Generics bieden sterke compilatietypecontrole en verminderen het risico op ClassCastException en expliciet casten van objecten.
12.2) Wat is T in Generics?
We gebruiken < T > om een generieke klasse, interface en methode te creëren. De T wordt vervangen door het daadwerkelijke type wanneer we het gebruiken.
12.3) Hoe werkt Generics in Java?
Generieke code zorgt voor typeveiligheid. De compiler gebruikt type-erasure om alle typeparameters te verwijderen tijdens het compileren om de overbelasting tijdens runtime te verminderen.
Generics in Java – Further Readings
Dat is alles voor generics in java, java generieke geneesmiddelen is een heel uitgebreid onderwerp en het kost veel tijd om het te begrijpen en effectief te gebruiken. Dit bericht hier is een poging om basisdetails van generieke geneesmiddelen te geven en hoe we het kunnen gebruiken om ons programma uit te breiden met type-safety.