java generics tutorial with examples
Java generički podaci skup su značajki koje omogućuju pisanje koda neovisno o tipu podataka. Ovaj članak detaljno objašnjava Java Generics sa primjerima:
Generički su proizvodi jedno od važnih obilježja Jave i predstavljeni su od Jave 5 nadalje.
Prema definiciji, generički su skup značajki Java jezika koji programeru omogućuju upotrebu generičkih vrsta i funkcija i na taj način osiguravaju sigurnost tipova.
kako programirati računala za početnike
Što ćete naučiti:
Kako generički lijekovi djeluju na Javi?
Ako ste već radili s C ++-om, tada je Java Generics isto što i predlošci u C ++-u. Java Generics omogućuje vam da u definiciju klase / metode uključite parametar koji će imati vrijednost primitivnog tipa podataka.
Na primjer, možete imati generički razred 'Array' kako slijedi:
Niz razreda {….}
Gdje je parametrizirani tip.
Dalje, možete stvoriti objekte za ovu klasu na sljedeći način:
Array int_array = new Array () Array char_array = new Array ();
Dakle, s obzirom na generičku parametarsku klasu, možete stvoriti objekte iste klase s različitim vrstama podataka kao parametrima. To je glavna bit korištenja Java Generics-a.
Slično tome, možete napisati generičku metodu s parametriziranim tipom za sortiranje niza, a zatim instancirati ovu metodu bilo kojem primitivnom tipu.
Java Generics uglavnom se koristi s kolekcijskim okvirom Java. Različite kolekcije poput LinkedList, List, Map, HashMap itd. Koriste Generics za implementaciju. Generički podaci pružaju sigurnost tipa jer se provjera tipa vrši u vrijeme kompajliranja, što vaš kôd čini stabilnijim.
Krenimo sada više u pojedinosti generičkih klasa i metoda kao i drugih srodnih tema.
Generička nastava
Generička klasa je ista kao i normalna klasa, s tim da nakon naziva klase slijedi tip u kutnim zagradama.
Opća definicija generičke klase je kako slijedi:
class class_name
{
varijable klase;
… ..
razredne metode;
}
Jednom kada je klasa definirana, možete stvoriti objekte bilo koje vrste podataka koji želite kako slijedi:
class_name obj = new class_name ();
Na primjer, za Integer objekt deklaracija će biti:
class_name obj = new class_name;
Slično tome, za tip podataka String objekt će biti:
class_name str_Obj = new class_name;
Primjer implementacije za generičku klasu prikazan je u nastavku.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args[]) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Izlaz:
U gornjem programu, klasa MyGenericClass generička je klasa. Ima dvije metode, tj. Dodaj i dobij. Metoda add inicijalizira generički objekt dok metode get vraćaju objekt.
U glavnoj funkciji deklariramo po dva objekta tipa Integer i String. Oba ova objekta inicijaliziramo odgovarajućim početnim vrijednostima metodom add, a zatim izlaznim sadržajem tih objekata koristimo metodu get.
Gore smo predstavili primjer generičke klase s jednim parametrom tipa. Ali u stvarnosti, klasa može imati i više parametara tipa. U ovom su slučaju parametri tipa odvojeni zarezom.
Sljedeći primjer to pokazuje:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String[] args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Izlaz:
U ovom programu imamo dva parametra tipa, tj. T1 i T2. Imamo funkcije za inicijalizaciju objekata članova i za ispis sadržaja. U glavnoj funkciji deklariramo objekt s dvije vrste, tj. String i Integer. Rezultat programa prikazuje sadržaj stvorenog objekta.
Baš kao i razredi, možete imati i generička sučelja. Sve o sučeljima naučit ćemo u zasebnoj temi.
Java generičke metode
Kao što možete imati generičke klase i sučelja, tako možete imati i generičke metode u slučaju da vam nije potrebna cijela klasa da biste bili generički.
Sljedeći program prikazuje provedbu generičke metode 'printGenericArray'. Obratite pažnju na poziv metode u glavnoj funkciji. Ovdje upućujemo dva poziva generičkoj metodi, prvi put s tipom, a zatim s tipom.
public class Main{ public static void printGenericArray(T[] items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args[] ) { Integer[] int_Array = { 1, 3, 5, 7, 9, 11 }; Character[] char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Izlaz:
Ograničeni parametri tipa
Parametri ograničenih tipova pojavljuju se na slici kada želite ograničiti tipove podataka u Generičkim podacima. Na primjer, ako želite da određena generička klasa ili metoda ili bilo koje sučelje treba raditi samo za numeričke tipove podataka, tada to možete odrediti pomoću ključne riječi 'extends'.
To je prikazano u nastavku:
List myList = new ArrayList(); List list1 = new ArrayList();
Sastavljač će prihvatiti gornje dvije deklaracije jer su Long i Integer potklase Number.
Sljedeća deklaracija, međutim, bit će problem.
List list = new ArrayList();
To će dovesti do pogreške tijekom vremena kompajliranja, jer String nije broj. Simbol ‘?’ U gornjem primjeru poznat je kao zamjenski znak i o njemu ćemo razgovarati dalje.
Dakle, općenito, ograničeni parametri tipa uglavnom se koriste kada želite ograničiti tipove podataka koji će se koristiti u vašem generičkom kodu.
Zamjenski znak Java Generics
Na Javi se zamjenski znak označava upitnikom ‘?’ Koji se koristi za označavanje nepoznate vrste. Zamjenski znakovi uglavnom se koriste s generičkim lijekovima kao vrstom parametra.
Kada koristite generičke zamjenske znakove, morate zapamtiti jednu točku da, iako je objekt superklasa svih ostalih klasa, kolekcija objekata ( Na primjer, Popis) nije superklasa svih ostalih zbirki.
Osim što se koristi kao tip parametra, zamjenski znak možete koristiti i kao polje, lokalnu varijablu i kao takvu. Međutim, nikada ne možete koristiti zamjenski znak kao nadtip ili kao argument tipa za pozivanje generičke metode ili u slučaju stvaranja instance generičke klase.
Postoji mnogo primjera parametriziranih tipova zamjenskih znakova (ovdje je barem jedan argument vrste zamjenski znak) kao što je prikazano u nastavku, a zamjenski znakovi korišteni na različitim mjestima tumačit će se različito:
- Kolekcija <: Kolekcija označava sve instancije sučelja kolekcije, bez obzira na korišteni argument tipa.
- Popis extends Number< : Popis predstavlja sve vrste popisa gdje će vrsta elementa biti broj.
- Usporednik: Sve instancije sučelja usporedbe za argumente tipa koji su Stringsupertypes.
Imajte na umu da je zamjenski parametarski tip pravilo koje se nameće za prepoznavanje valjanih tipova. To nije konkretan tip podataka. Generički zamjenski znakovi mogu biti ograničeni ili neograničeni.
eclipse ide za c / c ++
# 1) Neograničeni zamjenski znakovi
U neograničenim zamjenskim znakovima nema ograničenja za varijable tipa i označava se na sljedeći način:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Ograničeni zamjenski znakovi
Već smo razgovarali o ograničenim vrstama. Oni stavljaju ograničenja na tip podataka koji se koristi za instanciranje parametara tipa pomoću ključnih riječi - extends ili super. Ove zamjenske znakove možemo dalje podijeliti na zamjenske znakove za gornje i donje granice.
- Gornji ograničeni zamjenski znakovi
Ako želite da vaš generički izraz vrijedi za sve potklase dane vrste, tada specificirate gornji ograničeni zamjenski znak s ključnom riječi extends.
Na primjer, pretpostavimo da vam je potrebna generička metoda koja podržava List, List itd., tada možete odrediti gornji ograničeni zamjenski znak Popis . Kako je Number superklasa, ova će generička metoda raditi za sve svoje podrazrede.
Sljedeći program to pokazuje.
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String[] args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Izlaz:
Ovdje smo naveli zamjenski zamjenski znak, List za argument tipa funkcije 'zbrajanje'. U glavnoj funkciji definiramo dva popisa, tj. Int_list tipa Integer i doubles_list tipa Double. Kako su Integer i Double potklase Number, zbrajanje funkcija savršeno funkcionira na oba ova popisa.
- Donji ograničeni zamjenski znakovi
Ako želite da generički izraz prihvati sve superklase određenog tipa, tada možete navesti donji ograničeni zamjenski znak za svoj argument tipa.
Primjer provedbe za to dan je u nastavku:
importjava.util.*; class Main { public static void main(String[] args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Izlaz:
U ovom programu, dolje ograničeni zamjenski znak je 'Popis'. Tada u glavnoj funkciji imamo popis vrsta i popis. Kao što smo koristili donji ograničeni zamjenski znak, klasa Number je superklasa Integer valjan je argument tipa.
Pitanja i odgovori za administratora Salesforce administratora za iskusne
Prednosti Java generičara
# 1) Vrsta sigurnosti
Generički lijekovi osiguravaju sigurnost tipa. To znači da se provjera tipa vrši u vrijeme prevođenja, a ne u vrijeme izvođenja. Stoga nema šanse za dobivanje 'ClassCastException' tijekom izvođenja jer će se koristiti ispravni tipovi.
importjava.util.*; class Main { public static void main(String[] args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
U gore navedenom programu imamo dva popisa, jedan bez generičkih lijekova, a drugi s generičkim lijekovima. Na generičkom popisu ne postoji vrsta sigurnosti. Možete dodati cijeli broj, niz itd. Kao element i on je prihvaćen.
Na generički popis možete dodati samo jednu vrstu elementa koja je navedena u generičkom izrazu. Ako pokušate dodati element druge vrste, to rezultira pogreškom u vremenu prevođenja.
U gornjem programu pogreška vremena kompajliranja bljeska u retku:
list.add('10');
# 2) Ponovna upotreba koda
Korištenjem Generics-a ne trebate pisati zasebni kôd za svaku vrstu podataka. Možete napisati jednu klasu ili metodu itd. I koristiti je za sve vrste podataka.
# 3) Nema potrebe za slanjem tipova
Dok koristite Generics, kompajler zna o vrstama koje se koriste, tada nema potrebe za tipiziranjem.
Razmotrite donji kod:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Kao što možete vidjeti kada se koristi normalan popis, trebate otkucati element popisa na odgovarajući tip na način kako je to učinjeno za gore navedeni mystr.
Sad opet napišimo isti kod s generičkim popisom.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Ovdje smo naveli vrstu niza kao generički izraz za deklaraciju popisa. Dakle, da bismo dohvatili pojedine elemente ovog popisa, ne treba nam slati tekstove.
# 4) Primjena generičkih algoritama
Možete primijeniti puno više generičkih algoritama kada za generiranje koristite Generics.
# 5) Provjera vremena kompilacije
Kao što je već spomenuto, kada u svom programu Java koristite Generics, kompajler provjerava tipove u vrijeme kompajliranja, sprječavajući tako nenormalan završetak programa tijekom izvođenja.
Često postavljana pitanja
P # 1) Zašto u Java koristimo generičke proizvode?
Odgovor: Generički podaci osiguravaju neovisnost tipa, tj. Možemo pružiti parametar tipa dok definiramo klasu / sučelje / metodu itd., Tako da tijekom stvarne instancije možemo odrediti stvarni tip. Na ovaj način također osiguravamo ponovnu upotrebu koda.
P # 2) Jesu li generički lijekovi važni u Javi?
Odgovor: Da. U stvari, generički su najvažnije značajke Java-a kako bi se osigurala sigurnost tipa, tj. Provjera vremena u vremenu kompajliranja.
P # 3) Kada je Java dodala generičke proizvode?
Odgovor: Generički su dodani u Javu 2004. godine s J2SE 5.0 s namjerom da se osigura sigurnost tipa kompajliranja u Javi.
P # 4) Što je generički tip?
Odgovor: Generički tip je generička klasa, sučelje ili metoda koja se dobiva s parametrom tipa. To omogućuje sigurnost tipa i ponovnu upotrebu koda.
P # 5) Možemo li koristiti generike s Arrayom u Javi?
Odgovor: Ne. Java ne dopušta generičke nizove.
Zaključak
Ovim je završen tutorial o Java generičkim proizvodima koji se smatra jednom od najvažnijih značajki u novijim Java verzijama. Korištenje Generica u Java programima osigurava sigurnost tipova kao i ponovnu upotrebu koda. Također osigurava provjeru vremena kompajliranja kako se program ne bi pokvario tijekom izvođenja.
Generički programi Java dobro dolaze uglavnom sa sučeljem Java zbirki, o čemu ćemo detaljno raspravljati u drugom uputstvu iz ove serije.
Sretno čitanje !!
Preporučena literatura
- 15 najboljih JAVA alata za razvoj, izgradnju, profiliranje, pokrivanje koda i pregled
- Vodič za Java Collections Framework (JCF)
- Java vrste podataka, petlje, nizovi, prekidači i tvrdnje
- Implementacija Jave: Izrada i izvršavanje Java JAR datoteke
- Java iznimke i rukovanje iznimkama s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Java Vodič za refleksiju s primjerima
- Java 'this' ključna riječ: Vodič s primjerima koda