/ / Java Generics: beskrivning och metoder

Java Generics: Beskrivning och metoder

Sedan Java-språkets utseende har genomgått detmånga förändringar, vilket utan tvekan gav positiva stunder till dess funktionalitet. En sådan meningsfull förändring är introduktionen av Java Generic eller generalisering. Denna funktion har gjort språket inte bara mer flexibelt och mångsidigt men också mycket säkrare när det gäller att minska datatyperna.

java generics beskrivning

Faktum är att innan införandet av generisk generiskkod i Java kan bara skapas med hänvisning till objekttypen. Sådana länkar kan tilldelas något objekt. När allt kommer omkring är alla klasser i Java implicita efterkommande av Objeklassen. Detta tillvägagångssätt är dock en potentiell källa till många typer av säkerhetsfel när du uttryckligen konverterar ett objekt från objekt till måltypen. När generaliseringar används, utförs alla gjutningar implicit och automatiskt, vilket utesluter även möjligheten att fel uppstår.

Java Generics: beskrivning och exempel

Låt oss ta ett enkelt exempel på att tillämpa generaliseringen på den vanliga klassen i figuren nedan. Och först då kommer vi att fortsätta till en detaljerad undersökning av alla subtiliteter och nyanser av Java Generic.

generisk klass java

Lägg märke till hurParklassmeddelande. Strax efter klassnamnet öppnas vinkelkonsolerna, där bokstaven T är angivet. Det är en typ av platshållare som kommer att ersättas med en viss typ när man skapar en förekomst av denna klass. Det ser ut så här: Par <Heltal> obj = nytt par <heltal> (). Det bör noteras att istället för T kan du ange vilket brev som helst, men som regel använder du T, V eller E.

Obs! från och med den åttonde versionen av Java, med angivande av måltypen när länken är deklarerad, kan du lämna vinkelhakarna i konstruktorn tomma. Så ovanstående exempel kan skrivas om enligt följande: Par <Heltal> obj = nytt par <> ().

När en klass förklaras på detta sätt, då i sinDu kan använda detta brev istället för specifika fälttyper, referenser och metoder som returneras med metoder. Eftersom T ersätts av en viss typ när man skapar ett klassobjekt kommer de första och andra fälten i detta fall att vara av typen Integer.

Efter logiken börjar argumenten firstItem och secondItem,skickas till motsvarande konstruktör, måste också vara av typen Integer eller dess underklass. Om du försöker skicka en datatyp som skiljer sig från vad som angavs när objektet skapades kommer kompilatorn inte att hoppa över det här felet. Konstruktören med argument när man skapar objektet har följande formulär: Par <Integer> obj = nytt par <> (nytt heltal (1), nytt heltal (2)). Detsamma gäller för argumenten till setFirst och setSecond-metoderna. Och som du förmodligen redan gissat kommer metoderna getFirst och getSecond att returnera värden av typen Integer.

En generisk klass med flera typparametrar

I generiska klasser kan du också deklarera flera typparametrar som anges i vinklar, separerade med kommatecken. Pair klassen för detta fall presenteras i figuren nedan.

java generiska

Som du kan se när du skapar en förekomst av en sådan klassI vinkelfästena måste du ange samma antal typer som parametrarna. Om du är bekant med en sådan datastruktur som Map, kanske du märker att samma princip används där. Där bestämmer det första argumentet typen av nyckeln och den andra - typen av värdet. Det bör noteras att de typer av argument som skickas till objektets skapelse kan vara desamma. Så följande förklaring av en instans av klassen Par är absolut korrekt: Par <String, String> obj.

Några funktioner i generaliseringar

Innan vi fortsätter vidare bör det noteras attJava-kompilatorn skapar inte några olika versioner av Pair-klassen. Faktum är att under hela samlingsprocessen tas all information om generisk typ bort. I stället kastas motsvarande typer, skapar en speciell version av Pair-klassen. Programmet har dock fortfarande en enda generaliserad version av denna klass. Denna process kallas i Java Generic typ rengöring.

Låt oss notera en viktig punkt. Hänvisningar till olika versioner av samma java generiska klass kan inte peka på samma objekt. Låt oss säga att vi har två länkar: Pair <Integer> obj1 och par <Double> obj2. Därför uppstår ett fel i linjen obj1 = obj2. Även om båda variablerna är av typen Par <T>, är de föremål som de hänvisar till annorlunda. Detta är ett levande exempel på säkerhet för typer i Java Generic.

Begränsningar på allmänna klasser

Det är viktigt att veta att generaliseringar kan tillämpasendast för referenstyper, det vill säga argumentet som passerat till parameteren generisk klass java-argumentet måste vara en klasstyp. Sådana enkla typer som exempelvis dubbla eller långa kan inte överföras. Med andra ord är följande radparklassdeklaration inte giltig: Par <int> obj. Denna begränsning är emellertid inte ett allvarligt problem, eftersom Java har en motsvarande omslagsklass för varje primitiv typ. Strängt taget, om klassen Pair du vill kapsla in ett heltal och booleskt värde avtoupakovka gör allt för dig: Pair <Integer, Boolean> obj = new Pair <> (25, true).

En annan allvarlig begränsning äromöjlighet att skapa en instans av en typparameter. Följaktligen kommer följande rad att orsaka ett kompileringsfel: T första = ny T (). Detta är uppenbart, eftersom du inte vet i förväg om en full klass eller ett abstrakt gränssnitt kommer att överföras som ett argument. Detsamma gäller för att skapa arrays.

Begränsade typer

Oftast finns det situationer närDet är nödvändigt att begränsa listan över typer som kan överföras som ett argument till den java generiska klassen. Låt oss anta att vi i vår para-klass vill inkapsla uteslutande numeriska värden för ytterligare matematiska operationer på dem. För att göra detta måste vi ställa in övre gränsen för typparametern. Detta genomförs med hjälp av en superklassdeklaration som ärärd av alla argument som passeras i vinklar. Det kommer att se ut så här: klasspar <T utökar nummer>. På så sätt lär kompilatorn att i stället för T-parametern kan du ersätta antingen klassen Klass eller en av dess underklasser.

Detta är en vanlig teknik. Sådana begränsningar används ofta för att säkerställa kompatibilitet av typparametrar i samma klass. Tänk på ett exempel på vår parklass: klasspar <T, V utökar T>. Här berättar vi kompilatorn som typ T kan vara godtycklig, och typ V måste vara antingen typ T eller en av dess underklasser.

Begränsningen "från nedan" förekommer exakt densammabild, men i stället för ordet sträcker sig ordet super är skrivet. Det vill säga att deklarationen av klassparet <T super ArrayList> indikerar att istället för T kan antingen en ArrayList eller någon klass eller ett gränssnitt som det ärverts ersättas.

Generiska Java-metoder och konstruktörer

I Java kan generaliseringar tillämpas inte bara med avseende på klasser utan även metoder. Så kan den generaliserade metoden förklaras i den vanliga klassen.

generiska java metoder

Som du kan se i ovanstående figur finns ingenting komplicerat i de allmänna metoden. Det är nog att placera vinkelbeslag före returmetoden och ange typparametrar i dem.

När det gäller konstruktören görs allt på samma sätt:

java generisk typ rengöring

Vinkelbeslag i detta fall placeras före konstruktörens namn, eftersom det inte returnerar något värde. Resultatet av arbetet med båda programmen kommer att vara:

heltal

String

Läs mer: