Java Generics er en af de vigtigste funktioner i Java-sproget. Ideen bag generika er ganske enkel, men det nogle gange kommer ud som kompleks på grund af skiftet fra den sædvanlige syntaks forbundet med det.
formålet med denne vejledning er at introducere dig til dette nyttige koncept af generiske stoffer på en let forståelig måde.
men før vi dykker ind i generika selv, lad os finde ud af, hvorfor Java generics var nødvendige i første omgang.,
Formål af Java Generiske
Før indførelsen af generics i Java 5, kan du skrive og kompilere et kodestykke, som dette uden at kaste en fejl eller en advarsel:
Du kan tilføje værdier af enhver type til en liste eller et andet Java-Samling, uden at skulle til at erklære, hvilken type af data der er gemt. Men når du henter værdier fra listen, skal du eksplicit kaste den til en bestemt type.
overvej at gentage gennem ovenstående liste.,
som Tillader oprettelse af en liste uden først at erklære de lagrede data type, som vi gjorde, kan resultere i, at programmører at lave fejl som ovenstående, der kaster ClassCastExceptions
under runtime.
Generics blev introduceret for at forhindre programmørerne i at begå sådanne fejl.
med generics kan du eksplicit erklære den datatype, der skal gemmes, når du opretter en Java-samling, som følgende eksempel viser.,Bemærk: Du kan stadig oprette et Java-samlingsobjekt uden at angive den lagrede datatype, men det anbefales ikke.
nu Kan du ikke fejlagtigt gemme et heltal i en Strengtype liste uden at kaste en kompileringstidsfejl. Dette sikrer, at dit program ikke løber ind i runtime fejl.
hovedformålet med introduktionen af generika til Java var at undgå at løbe ind i ClassCastExceptions
under runtime.
oprettelse af Java Generics
Du kan bruge generics til at oprette Java klasser og metoder., Lad os se på eksemplerne på, hvordan man opretter generika af hver type.
generisk klasse
Når du opretter en generisk klasse, tilføjes typeparameteren for klassen i slutningen af klassenavnet inden for vinkel<>
parenteser.
Her T
data type parameter. T
N
og E
er nogle af de breve, der anvendes til data type parametre i henhold til Java konventioner.,
i ovenstående eksempel kan du sende det en bestemt datatype, når du opretter et GenericClass-objekt.
Du kan ikke overføre en primitiv datatype til parameteren datatype, når du opretter et generisk klasseobjekt. Kun datatyper, der udvider objekttype, kan overføres som typeparametre.
For eksempel:
Generiske Metoder
Oprettelse af generiske metoder, følger et lignende mønster for at skabe generiske klasser. Du kan implementere en generisk metode i en generisk klasse såvel som en ikke-generisk.,
Her kan du overføre en Matri array af en bestemt type for at parametrisere metoden. Den generiske metode PrintItems()
gentager gennem det passerede array og udskriver de gemte elementer ligesom en normal Java-metode.
afgrænsede Typeparametre
indtil videre kan de generiske klasser og metoder, vi oprettede ovenfor, parametriseres til enhver anden datatype end primitive typer. Men hvad nu hvis vi ønskede at begrænse de datatyper, der kan overføres til generika? Det er her, hvor afgrænsede type parametre kommer ind.,
Du kan binde de datatyper, der accepteres af en generisk klasse eller metode, ved at angive, at det skal være en underklasse af en anden datatype.
For eksempel:
Her UpperBoundedClass
og UpperBoundedMethod
kan kun være parametriserede hjælp undertyper af List
data type.
List
datatype fungerer som en øvre grænse for parameteren type. Hvis du forsøger at bruge en datatype, der ikke er en undertype af List
, kaster den en kompileringstidsfejl.
grænserne er ikke begrænset til kun klasser., Du kan også passere grænseflader. Udvidelse af grænsefladen betyder i dette tilfælde implementering af grænsefladen.
en parameter kan også have flere grænser, som dette eksempel viser.
den accepterende datatype skal være en underklasse af både dyre-og Pattedyrsklasser. Hvis en af disse grænser er en klasse, skal den komme først i den bundne erklæring.
i ovenstående eksempel, hvis pattedyr er en klasse og dyr er en grænseflade, skal Pattedyr komme først som vist ovenfor. Ellers kaster koden en kompileringstidsfejl.,
Java Generics Wildildcards
Wildildcards bruges til at videregive parametre for generiske typer til metoder. I modsætning til en generisk metode overføres den generiske parameter her til de parametre, der er accepteret af metoden, hvilket adskiller sig fra den datatypeparameter, vi diskuterede ovenfor. Et wildildcard er repræsenteret af ? symbol.
ovenstående printItems()
metode accepterer lister over enhver datatype som parameter. Dette forhindrer programmerere i at skulle gentage koder for lister over forskellige datatyper, hvilket ville være tilfældet uden generika.,
øvre afgrænsede jokertegn
Hvis vi ønsker at begrænse de datatyper, der er gemt på listen accepteret af metoden, kan vi bruge afgrænsede jokertegn.
Eksempel:
printSubTypes()
metode accepterer kun lister, der gemmer undertyper af Farve. Det accepterer en liste over RedColor eller BlueColor objekter, men accepterer ikke en liste over dyr objekter. Dette skyldes, at dyr ikke er en undertype af farve. Dette er et eksempel på et øvre afgrænset wildildcard.,
lavere afgrænsede jokertegn
tilsvarende, hvis vi havde:
, accepterer printSuperTypes()
– metoden kun lister, der gemmer supertyper af Hundeklassen. Det ville acceptere en liste over pattedyr eller Dyregenstande, men ikke en liste over LabDog-objekter, fordi LabDog ikke er en superklasse af hund, men en underklasse. Dette er et eksempel på et lavere afgrænset wildildcard.
konklusion
Java Generics er blevet en funktion, som programmerere ikke kan leve uden siden introduktionen.
denne popularitet skyldes dens indvirkning på at gøre programmørernes liv lettere., Bortset fra at forhindre dem i at lave kodningsfejl, gør brugen af generika koden mindre gentagen. Har du bemærket, hvordan det generaliserer klasser og metoder for at undgå at skulle gentage kode for forskellige datatyper?
at have et godt greb om generika er vigtigt for at blive ekspert på sproget. Så at anvende det, du lærte i denne tutorial i praktisk kode, er vejen at gå videre nu.