Exempel på Java Generics-exempel – Generisk metod, klass, gränssnitt
Java Genrics är en av de viktigaste funktionerna som introducerats i Java 5.
Om du har arbetat med Java Collections och med version 5 eller högre är jag säker på att du har använt den.
Generics i Java med samlingsklasser är väldigt enkelt men det ger mycket fler funktioner än bara att skapa typ av samling.
Vi kommer att försöka lära oss funktionerna i generik i den här artikeln. Att förstå generika kan ibland bli förvirrande om vi använder jargongord, så jag skulle försöka hålla det enkelt och lättförståeligt.
Generics i Java
Generics lades till i Java 5 för att ge kompileringstids typkontroll och ta bort risken för ClassCastException
som var vanligt när du arbetade med insamlingskurser. Hela samlingsramen skrevs om för att använda generika för typsäkerhet. Låt oss se hur generika hjälper oss att använda samlingsklasser på ett säkert sätt.
Ovanstående kod kompilerar bra men kastar ClassCastException vid körning eftersom vi försöker kasta objekt i listan till String medan ett av elementet är av typen Integer. Efter Java 5 använder vi samlingsklasser som nedan.
Lägg märke till att vid listans skapande har vi angett att typen av element i listan kommer att vara String. Så om vi försöker lägga till någon annan typ av objekt i listan kommer programmet att kasta kompileringsfel. Lägg också märke till att vi inte behöver typprospektera elementet i listan för loop, och därför tar vi bort ClassCastException vid körning.
Java Generic Class
Vi kan definiera våra egna klasser med generisk typ. En generisk typ är en klass eller ett gränssnitt som parametreras över typer. Vi använder vinkelparenteser (< >) för att ange typparametern.
För att förstå nyttan, låt oss säga Vi har en enkel klass som:
Observera att när vi använder den här klassen måste vi använda typgjutning och det kan producera ClassCastException vid körning. Nu kommer vi att använda java generic class för att skriva om samma klass som visas nedan.
Lägg märke till användningen av GenericsType-klassen i huvudmetoden. Vi behöver inte göra typgjutning och vi kan ta bort ClassCastException vid körning. Om vi inte tillhandahåller typen vid tidpunkten för skapandet kommer kompilatorn att ge en varning om att ”GenericsType är en rå typ.
Hänvisningar till generisk typ GenericsType < T > ska parametreras. När vi inte anger typen blir typen Object
och därmed tillåter båda strängar och Integer-objekt. Men vi bör alltid försöka undvika detta eftersom vi kommer att behöva använda typgjutning när vi arbetar med rå typ som kan ge runtime-fel.
@SuppressWarnings("rawtypes")
-anteckning för att undertrycka kompilatorvarningen, kolla in Java-annoteringshandledningen. Observera också att den stöder autoboxning av Java.
Java Generic Interface
Jämförbart gränssnitt är ett utmärkt exempel på Generics i gränssnitt och det är skrivet som:
På liknande sätt kan vi skapa generiska gränssnitt i java. Vi kan också har flera typparametrar som i kartgränssnittet förstärkning kan vi också ge parametrerat värde till en parametrerad typ, till exempel new HashMap<String, List<String>>();
är giltig.
Java Generic Type
Java Generic Type Naming konvention hjälper oss att förstå koden enkelt och att ha en namngivning är en av de bästa metoderna för Java-programmeringsspråk. Så generika har också sina egna namnkonventioner. Vanligtvis är typparameternamn enstaka versaler för att göra det lätt att skilja från Java-variabler. De vanligaste typparameternamnen är:
- E – Element (används i stor utsträckning av Java Collections Framework, till exempel ArrayList, Set etc.)
- K – Key ( Används i karta)
- N – nummer
- T – typ
- V – värde (används i karta)
- S, U, V etc. – 2: a, 3: e, 4: e typerna
Generisk Java-metod
Ibland vill vi inte att hela klassen ska parametreras, i så fall kan vi skapa java generics-metod. Eftersom konstruktören är en speciell typ av metod kan vi också använda generiska typer i konstruktörer.
Här är en klass som visar ett exempel på en Java-generisk metod.
Lägg märke till metoden isEqual signatur som visar syntax för att använda generiska typer i metoder. Lägg också märke till hur du använder dessa metoder i vårt Java-program. Vi kan ange typ när vi anropar dessa metoder eller så kan vi åberopa dem som en vanlig metod. Java-kompilatorn är tillräckligt smart för att bestämma vilken typ av variabel som ska användas, denna funktion kallas typinferens.
Parametrar för Java Generics avgränsade typ
Antag att vi vill begränsa typen av objekt som kan användas i den parametrerade typen, till exempel i en metod som jämför två objekt och vi vill se till att de accepterade objekten är jämförbara. För att deklarera en avgränsad typparameter, lista typparameternamnet, följt av det utvidgade nyckelordet, följt av dess övre gräns, liknande som nedanstående metod.
anrop av dessa metoder liknar obegränsad metod förutom att om vi försöker använda någon klass som inte är jämförbar, kommer det att kasta kompileringsfel.
Parametrar för avgränsad typ kan användas med såväl metoder som klasser och gränssnitt.
Java Generics stöder också flera gränser, dvs < T sträcker sig A & B & C >. I detta fall kan A vara ett gränssnitt eller klass. Om A är klass ska B och C vara ett gränssnitt. Vi kan inte ha mer än en klass i flera gränser.
Java Generics and Arv
Vi vet att Java-arv tillåter oss att tilldela en variabel A till en annan variabel B om A är underklass av B. Så vi kanske tror att vilken generisk typ av A som helst kan tilldelas generisk typ B, men så är det inte. Låt oss se detta med ett enkelt program.
Vi får inte tilldela MyClass < Sträng > variabel till MyClass < Objekt > variabel eftersom de inte är relaterade, i själva verket MyClass < T > förälder är objekt.
Java Generic Classes and Subtyping
Vi kan undertypa en generisk klass eller gränssnitt genom att utöka eller implementera den. Förhållandet mellan typparametrarna för en klass eller gränssnitt och typparametrarna för en annan bestäms av utvidgnings- och implementeringssatserna.
Subtypsförhållandet bevaras så länge vi inte ändrar typargumentet nedan visar ett exempel på flera typparametrar.
Undertyperna till listan < Sträng > kan vara MyList < Sträng, objekt >, MyList < Sträng, heltal > och så vidare.
Java Generics jokertecken
Frågetecken (?) Är jokertecknet i generik och representerar ett okänd typ. Jokertecknet kan användas som typ av en parameter, fält eller lokal variabel och ibland som en returtyp. Vi kan inte använda jokertecken när vi åberopar en generisk metod eller startar en generisk klass. I de följande avsnitten kommer vi att lära oss om övre avgränsade jokertecken, nedre avgränsade jokertecken och fångst av jokertecken.
9.1) Java Generics övre avgränsade jokertecken
Övre avgränsade jokertecken används för att slappna av begränsning av typen av variabel i en metod. Antag att vi vill skriva en metod som returnerar summan av siffror i listan, så vår implementering blir ungefär så här.
Nu är problemet med ovanför implementeringen är att det inte fungerar med List of Integers or Doubles eftersom vi vet att List < Heltal > och List < Dubbel > är inte relaterade, det är när ett övre gränsvikt är till hjälp. Vi använder generiska jokertecken med utökade nyckelord och den övre gränsklassen eller gränssnittet som gör att vi kan skicka argument av övre gräns eller dess underklasstyper.
Ovanstående implementering kan ändras som nedanstående program.
Det liknar att skriva vår kod i termer av gränssnitt, i ovanstående metod kan vi använda alla metoder i övre gränsklassnummer. Observera att med den övre begränsade listan får vi inte lägga till något objekt i listan utom null. Om vi försöker lägga till ett element i listan inuti summetoden kommer programmet inte att kompileras.
9.2) Java Generics Obegränsat jokertecken
Ibland har vi en situation där vi vill att vår generiska metod ska fungera med alla typer, i det här fallet kan ett obegränsat jokertecken användas. Är det samma som att använda <? utökar objekt >.
Vi kan tillhandahålla lista < Sträng > eller Lista < Heltal > eller någon annan typ av objektlistargument till printData-metoden. På samma sätt som den övre gränsen får vi inte lägga till något i listan.
9.3) Java Generics Undre gräns Jokertecken
Antag att vi vill lägga till heltal till en lista över heltal i en metod, vi kan behålla argumenttypen som List < Heltal > men det kommer att knytas samman med heltal medan Lista < Nummer > och Lista < Objekt > kan också innehålla heltal, så vi kan använda ett jokertecken med lägre gräns för att uppnå detta. Vi använder generiska jokertecken (?) Med super nyckelord och lägre gräns för att uppnå detta.
Vi kan skicka nedre gräns eller någon supertyp av nedre gräns som ett argument, i det här fallet tillåter java compiler att lägga till lägre bundna objekttyper till listan.
Undertypning med Generics jokertecken
Java Generics Type Erasure
Generics i Java lades till för att ge typkontroll vid kompileringstidpunkten och det har ingen användning vid körningstid, så Java-kompilatorn använder typraderingsfunktionen för att ta bort all generisk typkontrollkod i byte-kod och infoga typgjutning om det behövs. Typradering säkerställer att inga nya klasser skapas för parametrerade typer; följaktligen har generics ingen runtime overhead.
Till exempel, om vi har en generisk klass som nedan;
Java-kompilatorn ersätter den avgränsade typparametern T med det första bundna gränssnittet, Comparable , enligt nedanstående kod:
Vanliga frågor om generik
12.1) Varför använder vi Generics i Java?
Generics ger stark kontroll av kompileringstid och minskar risken för ClassCastException och explicit casting av objekt.
12.2) Vad är T i generics?
Vi använder < T > för att skapa en generisk klass, gränssnitt och metod. T ersätts med den faktiska typen när vi använder den.
12.3) Hur fungerar Generics i Java?
Generisk kod säkerställer typsäkerhet. Kompilatorn använder typ-radering för att ta bort alla typsparametrar vid kompileringen för att minska överbelastningen vid körning.
Generics i Java – Ytterligare avläsningar
Det är allt för generics i java, java generika är ett riktigt stort ämne och kräver mycket tid för att förstå och använda det effektivt. Det här inlägget här är ett försök att tillhandahålla grundläggande detaljer om generika och hur kan vi använda det för att utöka vårt program med typsäkerhet.