Eksempel på Java Generics-eksempel – Generisk metode, klasse, grænseflade
Java Genrics er en af de vigtigste funktioner, der introduceres i Java 5.
Hvis du har arbejdet med Java Collections og med version 5 eller nyere, er jeg sikker på, at du har brugt den.
Generics i Java med samlingsklasser er meget let, men det giver meget flere funktioner end bare at oprette type samling.
Vi vil forsøge at lære funktionerne i generiske stoffer i denne artikel. At forstå generik kan nogle gange blive forvirrende, hvis vi går med jargonord, så jeg vil prøve at holde det enkelt og let at forstå.
Generics i Java
Generics blev tilføjet i Java 5 for at give kompileringstidstypekontrol og fjernelse af risikoen for ClassCastException
, der var almindelig under arbejdet med indsamlingskurser. Hele indsamlingsrammen blev omskrevet for at bruge generiske stoffer til typesikkerhed. Lad os se, hvordan generiske hjælpemidler hjælper os med at bruge samlingsklasser sikkert.
Ovenstående kode kompilerer fint, men kaster ClassCastException ved kørsel, fordi vi prøver at kaste Objekt i listen til String, mens et af elementet er af typen Heltal. Efter Java 5 bruger vi samlingsklasser som nedenfor.
Bemærk, at vi på tidspunktet for oprettelse af listen har specificeret, at typen af elementer på listen vil være streng. Så hvis vi forsøger at tilføje en anden type objekt på listen, kaster programmet kompileringsfejl. Bemærk også, at vi ikke har behov for typecasting af elementet på listen i loop, og derfor fjernes ClassCastException ved kørsel.
Generisk Java-klasse
Vi kan definere vores egne klasser med generisk type. En generisk type er en klasse eller grænseflade, der er parametreret over typer. Vi bruger vinkelparenteser (< >) til at specificere typeparameteren.
For at forstå fordelen, lad os sige Vi har en simpel klasse som:
Bemærk, at mens vi bruger denne klasse, skal vi bruge type casting, og det kan producere ClassCastException ved kørsel. Nu bruger vi java generic class til at omskrive den samme klasse som vist nedenfor.
Bemærk brugen af GenericsType-klasse i hovedmetoden. Vi behøver ikke at foretage typegods, og vi kan fjerne ClassCastException ved kørsel. Hvis vi ikke angiver typen på tidspunktet for oprettelsen, producerer compileren en advarsel om, at “GenericsType er en rå type.
Henvisninger til generisk type GenericsType < T > skal parametriseres. “Når vi ikke angiver typen, bliver typen Object
og dermed tillader det begge streng og heltal-objekter. Men vi skal altid forsøge at undgå dette, fordi vi bliver nødt til at bruge type casting, mens vi arbejder på rå type, der kan producere runtime-fejl.
@SuppressWarnings("rawtypes")
annotation for at undertrykke kompilatoradvarslen, se java-annotationsvejledningen. Bemærk også, at den understøtter Java-autoboxing.
Java Generic Interface
Sammenlignelig grænseflade er et godt eksempel på Generics i grænseflader, og den er skrevet som:
På lignende måde kan vi oprette generiske grænseflader i java. Vi kan også har flere typeparametre som i kortgrænsefladen gevinst, vi kan også give parametreret værdi til en parametreret type, for eksempel er new HashMap<String, List<String>>();
gyldig.
Java Generic Type
Java Generic Type Naming konvention hjælper os med at forstå kode let, og at have en navngivningskonvention er en af de bedste fremgangsmåder i Java-programmeringssprog. Så generiske stoffer kommer også med sine egne navngivningskonventioner. Normalt er typeparameternavne enkelt, store bogstaver for at gøre det let at skelne fra java-variabler. De mest anvendte typeparameternavne er:
- E – Element (brugt i vid udstrækning af Java Collections Framework, for eksempel ArrayList, Set osv.)
- K – Key ( Brugt i kort)
- N – nummer
- T – type
- V – værdi (brugt i kort)
- S, U, V osv. – 2., 3., 4. type
Generisk Java-metode
Nogle gange ønsker vi ikke, at hele klassen skal parametriseres, i så fald kan vi oprette java generiske metoder. Da konstruktøren er en særlig metode, kan vi også bruge generiske typer i konstruktører.
Her er en klasse, der viser et eksempel på en java generisk metode.
Bemærk isEqual-metoden signatur, der viser syntaks for at bruge generiske typer i metoder. Bemærk også, hvordan du bruger disse metoder i vores java-program. Vi kan specificere typen, mens vi kalder disse metoder, eller vi kan påberåbe dem som en normal metode. Java-kompilator er smart nok til at bestemme den type variabel, der skal bruges, denne facilitet kaldes typeinferens.
Parametre for Java Generics afgrænset type
Antag, at vi vil begrænse typen af objekter, der kan bruges i den parametriserede type, for eksempel i en metode, der sammenligner to objekter, og vi vil Sørg for, at de accepterede objekter er sammenlignelige. For at erklære en afgrænset typeparameter skal du angive typeparameterens navn efterfulgt af det udvidede søgeord efterfulgt af dets øvre grænse, ligesom nedenstående metode.
påkaldelse af disse metoder svarer til ubegrænset metode, bortset fra at hvis vi prøver at bruge en klasse, der ikke er sammenlignelig, vil den kaste kompileringstidsfejl.
Parametre for afgrænset type kan bruges med metoder såvel som klasser og grænseflader.
Java Generics understøtter også flere grænser, dvs. < T udvider A & B & C >. I dette tilfælde kan A være en grænseflade eller klasse. Hvis A er klasse, skal B og C være en grænseflade. Vi kan ikke have mere end en klasse inden for flere grænser.
Java Generics and Arv
Vi ved, at Java-arv giver os mulighed for at tildele en variabel A til en anden variabel B, hvis A er underklasse af B. Så vi tror måske, at enhver generisk type A kan tildeles til generisk type B, men det er ikke tilfældet. Lad os se dette med et simpelt program.
Vi har ikke lov til at tildele MyClass < Streng > -variabel til MyClass < Objekt > variabel, fordi de ikke er relateret, faktisk MyClass < T > forælder er objekt.
Generiske Java-klasser og undertypning
Vi kan undertype en generisk klasse eller grænseflade ved at udvide eller implementere den. Forholdet mellem typeparametrene for en klasse eller grænseflade og typeparametrene for en anden bestemmes af udvidelser og implementeringsklausuler.
Undertypeforholdet bevares, så længe vi ikke ændrer typeargumentet, nedenfor viser et eksempel på flere typeparametre.
Undertyperne til liste < Streng > kan være MyList < String, Object >, MyList < Streng, heltal > og så videre.
Java Generics jokertegn
Spørgsmålstegn (?) Er jokertegnet i generiske og repræsenterer et ukendt type. Jokertegnet kan bruges som typen af en parameter, felt eller lokal variabel og undertiden som en returtype. Vi kan ikke bruge jokertegn, når vi påberåber en generisk metode eller indleder en generisk klasse. I de følgende sektioner lærer vi om øvre afgrænsede wildcards, nedre afgrænsede wildcards og wildcard capture.
9.1) Java Generics Upper Bounded Wildcard
Øvre afgrænsede wildcards bruges til at slappe af begrænsning af typen af variabel i en metode. Antag, at vi vil skrive en metode, der vil returnere summen af numre på listen, så vores implementering vil være sådan noget.
Nu er problemet med ovenstående implementering er, at det ikke fungerer med Liste over heltal eller fordobling, fordi vi ved, at liste < Heltal > og Liste < Dobbelt > er ikke beslægtede, det er når et øvre afgrænset jokertegn er nyttigt. Vi bruger generiske jokertegn med udvidet søgeord og den øvre grænse klasse eller grænseflade, der giver os mulighed for at videregive argument af øvre grænse eller dets underklassetyper.
Ovenstående implementering kan ændres som det nedenstående program.
Det er ligesom at skrive vores kode med hensyn til grænseflade. I ovenstående metode kan vi bruge alle metoderne i den øvre grænse klasse Number. Bemærk, at vi med den øverste afgrænsede liste ikke har tilladelse til at tilføje noget objekt til listen undtagen null. Hvis vi forsøger at tilføje et element til listen inde i summetoden, kompileres programmet ikke.
9.2) Java Generics Unbounded Wildcard
Nogle gange har vi en situation, hvor vi ønsker, at vores generiske metode skal arbejde med alle typer, i dette tilfælde kan et ubegrænset jokertegn bruges. Det er det samme som at bruge <? udvider objekt >.
Vi kan levere liste < Streng > eller Liste < Heltal > eller enhver anden type objektlisteargument til printData-metode. I lighed med den øvre grænse er det ikke tilladt at tilføje noget til listen.
9.3) Java Generics Nedre afgrænset jokertegn
Antag at vi vil tilføje heltal til en liste over heltal i en metode, vi kan beholde argumenttypen som Liste < Heltal > men det vil være bundet med heltal, mens liste < Nummer > og liste < Objekt > kan også indeholde heltal, så vi kan bruge et jokertegn med lavere grænser for at opnå dette. Vi bruger generiske jokertegn (?) Med super nøgleord og lavere grænse klasse for at opnå dette.
Vi kan videregive nedre grænse eller enhver supertype af nedre grænse som et argument, i dette tilfælde tillader java compiler at tilføje lavere bundne objekttyper til listen.
Undertypning ved hjælp af Generics jokertegn
Java Generics Type Sletning
Generics i Java blev tilføjet for at give typekontrol på kompileringstidspunktet, og det har ingen brug ved kørselstid, så java compiler bruger type sletningsfunktion til at fjerne alle generiske typekontrolkoder i byte-kode og indsætte om nødvendigt type-casting. Type sletning sikrer, at der ikke oprettes nye klasser til parametriserede typer; følgelig har generics ingen runtime-overhead.
For eksempel, hvis vi har en generisk klasse som nedenfor;
Java-kompilatoren erstatter parameteren T afgrænset type T med den første bundne grænseflade, Sammenlignelig , som nedenfor kode:
Generiske ofte stillede spørgsmål
12.1) Hvorfor bruger vi Generics i Java?
Generics giver stærk kompileringstidskontrol og reducerer risikoen for ClassCastException og eksplicit casting af objekter.
12.2) Hvad er T i Generics?
Vi bruger < T > for at oprette en generisk klasse, grænseflade og metode. T erstattes med den aktuelle type, når vi bruger den.
12.3) Hvordan fungerer Generics i Java?
Generisk kode sikrer typesikkerhed. Compileren bruger typesletning til at fjerne alle typeparametre på kompileringstidspunktet for at reducere overbelastningen ved kørsel.
Generics i Java – Yderligere læsninger
Det er alt sammen til generics i java, java generiske stoffer er et virkelig stort emne og kræver meget tid til at forstå og bruge det effektivt. Dette indlæg her er et forsøg på at give grundlæggende detaljer om generiske lægemidler, og hvordan kan vi bruge det til at udvide vores program med typesikkerhed.