Eksempel på opplæring i Java Generics – Generisk metode, klasse, grensesnitt
Java Genrics er en av de viktigste funksjonene som er introdusert i Java 5.
Hvis du har jobbet med Java Collections og med versjon 5 eller nyere, er jeg sikker på at du har brukt den.
Generics i Java med samlingsklasser er veldig enkelt, men det gir mange flere funksjoner enn bare å lage type samling.
Vi vil prøve å lære funksjonene til generiske stoffer i denne artikkelen. Å forstå generikk kan bli forvirrende noen ganger hvis vi går med sjargongord, så jeg vil prøve å holde det enkelt og lett å forstå.
Generics i Java
Generics ble lagt til i Java 5 for å gi kompileringstidskontroll og fjerning av risikoen for ClassCastException
som var vanlig mens du jobbet med samlingstimer. Hele samlingsrammeverket ble omskrevet for å bruke generiske stoffer for typesikkerhet. La oss se hvordan generikk hjelper oss med å bruke samlingsklasser trygt.
Ovenstående kode kompilerer fint, men kaster ClassCastException ved kjøretid fordi vi prøver å kaste Object i listen til String mens et av elementet er av typen Integer. Etter Java 5 bruker vi samlingsklasser som nedenfor.
Legg merke til at på tidspunktet for opprettelse av listen har vi spesifisert at typen elementer i listen vil være streng. Så hvis vi prøver å legge til noen annen type objekt i listen, vil programmet kaste kompileringsfeil. Legg også merke til at i for loop trenger vi ikke typecasting av elementet i listen, og derfor fjerner ClassCastException under kjøretid.
Java Generic Class
Vi kan definere våre egne klasser med generisk type. En generisk type er en klasse eller et grensesnitt som er parameterisert over typer. Vi bruker vinkelparenteser (< >) for å spesifisere typeparameteren.
For å forstå fordelen, la oss si Vi har en enkel klasse som:
Legg merke til at mens vi bruker denne klassen, må vi bruke type casting, og den kan produsere ClassCastException ved kjøretid. Nå vil vi bruke java generisk klasse til å omskrive samme klasse som vist nedenfor.
Legg merke til bruken av GenericsType-klassen i hovedmetoden. Vi trenger ikke å utføre typekasting, og vi kan fjerne ClassCastException ved kjøretid. Hvis vi ikke oppgir typen på tidspunktet for opprettelsen, vil kompilatoren gi en advarsel om at «GenericsType er en rå type.
Referanser til generisk type GenericsType < T > skal parametriseres. «Når vi ikke oppgir typen, blir typen Object
og dermed tillater begge strengene og Integer-objekter. Men vi bør alltid prøve å unngå dette fordi vi må bruke type casting mens vi jobber med rå type som kan gi kjøretidsfeil.
@SuppressWarnings("rawtypes")
kommentar for å undertrykke kompilatorvarselen, sjekk opp java-kommentarveiledningen. Legg også merke til at den støtter autoboksing av Java.
Java Generic Interface
Sammenlignbart grensesnitt er et godt eksempel på Generics i grensesnitt, og det er skrevet som:
På samme måte kan vi lage generiske grensesnitt i java. Vi kan også har flere typeparametere som i Kartgrensesnitt gevinst kan vi også gi parameterisert verdi til en parameterisert type, for eksempel new HashMap<String, List<String>>();
er gyldig.
Java Generic Type
Java Generic Type Naming konvensjon hjelper oss med å forstå koden enkelt, og å ha en navngivningskonvensjon er en av de beste metodene for Java-programmeringsspråk. Så generiske stoffer kommer også med sine egne navnekonvensjoner. Vanligvis er typeparameternavn enkle, store bokstaver for å gjøre det lett å skille fra Java-variabler. De mest brukte typeparameternavnene er:
- E – Element (brukt mye av Java Collections Framework, for eksempel ArrayList, Set etc.)
- K – Key ( Brukt i kart)
- N – Antall
- T – Type
- V – Verdi (brukt i kart)
- S, U, V etc. – 2., 3., 4. type
Generisk Java-metode
Noen ganger vil vi ikke at hele klassen skal parametriseres, i så fall kan vi lage java generiske metoden. Siden konstruktøren er en spesiell type metode, kan vi også bruke generiske typer i konstruktører.
Her er en klasse som viser et eksempel på en java generisk metode.
Legg merke til isEqual-metoden signatur som viser syntaksen for å bruke generiske typer i metoder. Legg også merke til hvordan du bruker disse metodene i vårt java-program. Vi kan spesifisere type mens vi kaller disse metodene, eller vi kan påberope dem som en vanlig metode. Java-kompilatoren er smart nok til å bestemme hvilken type variabel som skal brukes, dette anlegget kalles type inferens.
Parametere for Java Generics avgrenset type
Anta at vi vil begrense typen objekter som kan brukes i den parametriserte typen, for eksempel i en metode som sammenligner to objekter, og vi vil sørg for at de aksepterte objektene er sammenlignbare. For å erklære en avgrenset type-parameter, oppgi navnet på typeparameteren, etterfulgt av det utvidede nøkkelordet, etterfulgt av den øvre grensen, lignende som nedenfor metoden.
The påkalling av disse metodene ligner på ubegrenset metode, bortsett fra at hvis vi prøver å bruke en klasse som ikke er sammenlignbar, vil den kaste kompileringsfeil.
Parametre for avgrensede typer kan brukes med metoder så vel som klasser og grensesnitt.
Java Generics støtter også flere grenser, dvs. < T utvider A & B & C >. I dette tilfellet kan A være et grensesnitt eller klasse. Hvis A er klasse, bør B og C være et grensesnitt. Vi kan ikke ha mer enn en klasse i flere rammer.
Java Generics and Arv
Vi vet at Java-arv lar oss tilordne en variabel A til en annen variabel B hvis A er underklasse av B. Så vi kan tro at enhver generisk type A kan tilordnes til generisk type B, men det er ikke tilfelle. La oss se dette med et enkelt program.
Vi har ikke lov til å tildele MyClass < Streng > -variabel til MyClass < Objekt > variabel fordi de ikke er relatert, faktisk MyClass < T > foreldre er objekt.
Java Generic Classes and Subtyping
Vi kan subtype en generisk klasse eller grensesnitt ved å utvide eller implementere den. Forholdet mellom typeparametrene til en klasse eller grensesnitt og typeparametrene til en annen bestemmes av utvidelses- og implementeringssatsene.
Subtypeforholdet bevares så lenge vi ikke endrer typeargumentet nedenfor viser et eksempel på flere typeparametere.
Undertypene til Liste < Streng > kan være MyList < Streng, Objekt >, MyList < Streng, heltal > og så videre.
Java Generics jokertegn
Spørsmålstegn (?) Er jokertegnet i generikk og representerer et ukjent type. Jokertegnet kan brukes som typen parameter, felt eller lokal variabel og noen ganger som returtype. Vi kan ikke bruke jokertegn når vi påberoper oss en generisk metode eller starter en generisk klasse. I de følgende seksjonene vil vi lære om øvre avgrensede jokertegn, nedre avgrensede jokertegn og jokertegnfangst.
9.1) Java Generics Øvre avgrensede jokertegn
Øvre avgrensede jokertegn brukes til å slappe av begrensning på typen variabel i en metode. Anta at vi vil skrive en metode som vil returnere summen av tall i listen, så implementeringen vår blir noe sånt.
Nå er problemet med over implementeringen er at det ikke fungerer med Liste over helheter eller dobler fordi vi vet at Liste < Heltall > og Liste < Dobbelt > er ikke relatert, dette er når et øvre grenser wildcard er nyttig. Vi bruker generiske jokertegn med utvidede søkeord og den øvre grensen eller grensesnittet som gjør at vi kan overføre argument av øvre grense eller dets underklassetyper.
Gjennomføringen ovenfor kan endres som programmet nedenfor.
Det ligner på å skrive koden vår når det gjelder grensesnitt. I metoden ovenfor kan vi bruke alle metodene i øvre grense klasse Number. Merk at med øvre avgrenset liste har vi ikke lov til å legge til noe objekt i listen bortsett fra null. Hvis vi prøver å legge til et element i listen inne i summetoden, kompileres ikke programmet.
9.2) Java Generics Unbounded Wildcard
Noen ganger har vi en situasjon der vi vil at vår generiske metode skal fungere med alle typer, i dette tilfellet kan et ubegrenset jokertegn brukes. Det samme som å bruke <? utvider objektet >.
Vi kan tilby liste < Streng > eller Liste < Heltall > eller en hvilken som helst annen type objektlisteargument til printData-metoden. I likhet med øvre grense liste, har vi ikke lov til å legge til noe i listen.
9.3) Java Generics Lavere avgrensede jokertegn
Anta at vi vil legge til heltall i en liste over heltall i en metode, vi kan beholde argumenttypen som Liste < Heltall > men det blir bundet med heltal, mens liste < Nummer > og List < Objekt > kan også inneholde heltall, så vi kan bruke et jokertegn med lavere grenser for å oppnå dette. Vi bruker generiske jokertegn (?) Med super søkeord og lavere grense klasse for å oppnå dette.
Vi kan passere nedre grense eller hvilken som helst supertype av nedre grense som et argument, i dette tilfellet tillater java kompilator å legge til lavere bundet objekttyper til listen.
Subtyping ved hjelp av Generics jokertegn
Java Generics Type Erasure
Generics i Java ble lagt til for å gi typekontroll på kompileringstidspunktet, og det har ingen bruk på kjøretid, så java kompilator bruker type slettingsfunksjon for å fjerne all generisk typekontrollkode i bytekode og sette inn type casting om nødvendig. Type sletting sikrer at ingen nye klasser blir opprettet for parametrerte typer; følgelig har generics ingen runtime overhead.
For eksempel, hvis vi har en generisk klasse som nedenfor;
Java-kompilatoren erstatter parameteren T for begrenset type T med det første bundne grensesnittet, Comparable , som nedenfor kode:
Vanlige spørsmål om generikk
12.1) Hvorfor bruker vi Generics i Java?
Generics gir sterk tidstypekontroll og reduserer risikoen for ClassCastException og eksplisitt avstøpning av objekter.
12.2) Hva er T i Generics?
Vi bruker < T > for å lage en generell klasse, grensesnitt og metode. T erstattes med den faktiske typen når vi bruker den.
12.3) Hvordan fungerer Generics i Java?
Generisk kode sikrer typesikkerhet. Kompilatoren bruker type-sletting for å fjerne alle typeparametere på kompileringstidspunktet for å redusere overbelastningen ved kjøretid.
Generics i Java – Ytterligere avlesninger
Det er alt for generics i java, java generikk er et veldig stort tema og krever mye tid for å forstå og bruke det effektivt. Dette innlegget her er et forsøk på å gi grunnleggende detaljer om generiske legemidler og hvordan kan vi bruke det til å utvide programmet vårt med typesikkerhet.