Java Generics är en av de viktigaste funktionerna i Java-språket. Tanken bakom generics är ganska enkel, men det kommer ibland som komplicerat på grund av skiftet från den vanliga syntaxen som är associerad med den.
syftet med denna handledning är att introducera dig till detta användbara koncept av generika på ett lättförståeligt sätt.
men innan du dyker in generics själv, låt oss ta reda på varför Java generics behövdes i första hand.,
syftet med Java Generics
innan generics introduceras i Java 5 kan du skriva och sammanställa ett kodavsnitt som detta utan att kasta ett fel eller en varning:
Du kan lägga till värden av vilken typ som helst i en lista eller annan Java-samling utan att behöva ange vilken typ av data den lagrar. Men när du hämtar värden från listan måste du uttryckligen kasta den till en viss typ.
överväga iteration genom ovanstående lista.,
Om du tillåter att en lista skapas utan att först deklarera den lagrade datatypen, som vi gjorde, kan det leda till att programmerare gör misstag som ovan som kastarClassCastExceptions
under körtiden.
generika introducerades för att förhindra att programmerarna gör sådana misstag.
med generics kan du uttryckligen deklarera den datatyp som ska lagras när du skapar en Java-samling som följande exempel visar.,
Nu kan du inte felaktigt lagra ett heltal i en Strängtyplista utan att kasta ett kompileringsfel. Detta säkerställer att ditt program inte stöter på runtime fel.
huvudsyftet med introduktionen av generika till Java var att undvika att köra in iClassCastExceptions
under körning.
skapa Java Generics
Du kan använda generics för att skapa Java-klasser och-metoder., Låt oss titta på exemplen på hur man skapar generika av varje typ.
Generisk klass
När du skapar en generisk klass läggs typparametern för klassen till i slutet av klassnamnet inom vinkel<>
parentes.
här ärT
datatypsparametern. T
, N
och E
är några av de bokstäver som används för datatypsparametrar enligt Java-konventioner.,
i exemplet ovan kan du skicka den en specifik datatyp när du skapar ett GenericClass-objekt.
Du kan inte skicka en primitiv datatyp till datatypsparametern när du skapar ett generiskt klassobjekt. Endast datatyper som utökar Objekttyp kan skickas som typparametrar.
till exempel:
generiska metoder
att skapa generiska metoder följer ett liknande mönster för att skapa generiska klasser. Du kan implementera en generisk metod i en generisk klass samt en icke-Generisk.,
Här kan du skicka en array av en viss typ för att parametrisera metoden. Den generiska metoden PrintItems()
itererar genom den godkända matrisen och skriver ut de objekt som lagras precis som en vanlig Java-metod.
avgränsade typparametrar
hittills kan de generiska klasserna och metoderna som vi skapade ovan parametreras till någon annan datatyp än primitiva typer. Men vad händer om vi ville begränsa de datatyper som kan överföras till generika? Det är här avgränsade typparametrar kommer in.,
Du kan binda de datatyper som accepteras av en generisk klass eller metod genom att ange att det ska vara en underklass av en annan datatyp.
till exempel:
här kanUpperBoundedClass
ochUpperBoundedMethod
endast parametriseras med hjälp av undertyper av datatypenList
.
List
datatyp fungerar som en övre gräns för typparametern. Om du försöker använda en datatyp som inte är en undertyp av List
, kommer det att kasta ett kompileringsfel.
gränserna är inte begränsade till endast klasser., Du kan också passera gränssnitt. Förlängning av gränssnittet innebär i detta fall att implementera gränssnittet.
en parameter kan också ha flera gränser som det här exemplet visar.
den accepterande datatypen måste vara en underklass av både djur-och Däggdjursklasser. Om en av dessa gränser är en klass måste den komma först i den bundna deklarationen.
i ovanstående exempel, om däggdjur är en klass och djur är ett gränssnitt, Däggdjur måste komma först som visas ovan. Annars kastar koden ett kompileringsfel.,
jokertecken för Java Generics
jokertecken används för att överföra parametrar av generiska typer till metoder. Till skillnad från en generisk metod överförs den generiska parametern till de parametrar som accepteras av metoden, vilket skiljer sig från datatypsparametern vi diskuterade ovan. Ett jokertecken representeras av ? symbol.
ovanståendeprintItems()
metod accepterar listor över alla datatyper som parameter. Detta förhindrar programmerare från att behöva upprepa koder för listor över olika datatyper, vilket skulle vara fallet utan generika.,
övre avgränsade jokertecken
om vi vill begränsa de datatyper som lagras i listan som accepteras av metoden kan vi använda avgränsade jokertecken.
exempel:
printSubTypes()
metoden accepterar endast de listor som lagrar undertyper av färg. Den accepterar en lista över RedColor-eller BlueColor-objekt, men accepterar inte en lista över djurobjekt. Detta beror på att djur inte är en subtyp av färg. Detta är ett exempel på ett övre avgränsat jokertecken.,
lägre avgränsade jokertecken
På samma sätt, om vi hade:
då accepterar printSuperTypes()
– metoden endast listor som lagrar Supertyper av hundklassen. Det skulle acceptera en lista över däggdjur eller Djurobjekt men inte en lista över LabDog objekt eftersom LabDog är inte en superklass av hund, men en underklass. Detta är ett exempel på ett lägre avgränsat jokertecken.
slutsats
Java Generics har blivit en funktion som programmerare inte kan leva utan sedan introduktionen.
denna popularitet beror på dess inverkan på att göra programmerares liv enklare., Förutom att hindra dem från att göra kodningsfel, gör användningen av generika koden mindre repetitiv. Märkte du hur det generaliserar klasser och metoder för att undvika att behöva upprepa kod för olika datatyper?
att ha ett bra grepp om generika är viktigt att bli expert på språket. Så, tillämpa vad du lärt dig i denna handledning i praktisk kod är vägen att gå framåt nu.