Java generice: descriere și metode

De la începuturi, limba Java a suferit numeroase modificări, ceea ce, fără îndoială, a adus caracteristici pozitive funcționalității sale. O astfel de modificare semnificativă este introducerea Java Generic sau generalizare. Această funcționalitate a făcut limba nu numai mai flexibilă și versatilă, dar și mult mai sigură în ceea ce privește reducerea tipurilor de date.

java generice descriere

Faptul este că, înainte de introducerea genericilor, codul generic din Java ar putea fi creat numai prin trimiterea la tipul de obiect. Astfel de legături pot fi atribuite oricărui obiect. La urma urmei, toate clasele din Java sunt descendenți impliciți ai clasei Object. Cu toate acestea, această abordare este o sursă potențială de multe erori de siguranță de tip atunci când convertiți în mod explicit un obiect de la Obiect la tipul țintă. Atunci când se folosesc generalizări, toate distribuțiile sunt efectuate implicit și automat, ceea ce exclude chiar posibilitatea de apariție a erorilor.

Java Generics: descriere și exemplu

Să luăm un exemplu simplu de aplicare a generalizării la clasa obișnuită din figura de mai jos. Și numai atunci vom trece la o examinare detaliată a tuturor subtilităților și nuanțelor Java Generic.

generic java de clasă

Observați cum este declarată clasa Pair. Imediat după numele clasei, parantezele unghiulare sunt deschise, în care este indicată litera T. Este un tip de substituent care va fi înlocuit cu un anumit tip atunci când creați o instanță a acestei clase. Se pare ca aceasta: Pereche obj = o pereche nouă< Integer> (). Trebuie notat că în loc de T, puteți specifica orice literă, dar, de regulă, utilizați T, V sau E.

Notă: Începând cu cea de-a opta versiune Java, specificând tipul de destinație atunci când link-ul este declarat, puteți lăsa parantezele unghiulare în constructor goale. Deci, exemplul de mai sus poate fi rescris după cum urmează: Pereche obj = o pereche nouă<> ().

Când o clasă este declarată astfel, atunci în acest corp, în loc de tipuri specifice de câmpuri, referințe și metode returnate prin metode, puteți utiliza această literă. Deoarece T este înlocuit de un tip specific la crearea unui obiect de clasă, primul și al doilea câmp vor fi de tipul Integer.

În urma logicii, argumentele firstItem și secondItem, transmise constructorului corespunzător, trebuie să fie de tipul Integer sau subclasa sa. Dacă încercați să transmiteți un tip de date diferit de cel specificat la crearea obiectului, compilatorul nu va sări peste această eroare. Deci, constructorul cu argumente la crearea obiectului va avea următoarea formă: Pair obj = o pereche nouă<> (noul Integer (1), noul Integer (2)). Același lucru se aplică argumentelor pentru metodele setFirst și setSecond. Și cum probabil ați ghicit deja, metodele getFirst și getSecond vor returna valorile de tip Integer.

O clasă generică cu mai mulți parametri de tip

În clasele generice, puteți declara și câțiva parametri de tip care sunt specificați în paranteze unghiulare separate prin virgule. Clasa Pair pentru acest caz este prezentată în figura de mai jos.

java generic

După cum puteți vedea, atunci când creați o instanță a unei astfel de clase în paranteze unghiulare, ar trebui specificat același număr de tipuri ca parametrii. Dacă sunteți familiarizat cu o astfel de structură de date ca Harta, atunci este posibil să observați că același principiu este utilizat acolo. Există primul argument care determină tipul cheii, iar al doilea - tipul valorii. Trebuie remarcat faptul că tipurile de argumente transmise la crearea obiectului pot fi aceleași. Deci, următoarea declarație a unei instanțe a clasei Pair este absolut corectă: Pair obj.

Unele caracteristici ale generalizărilor

Înainte de a continua, trebuie menționat faptul că compilatorul Java nu creează alte versiuni ale clasei Pair. De fapt, în timpul procesului de compilare, toate informațiile despre tipul generic sunt șterse. În schimb, sunt distribuite tipurile corespunzătoare, creând o versiune specială a clasei Pair. Cu toate acestea, programul în sine are încă o singură versiune generalizată a acestei clase. Acest proces este numit în curățarea de tip generic Java.

Să notăm un punct important. Referințele la diferite versiuni ale aceleiași clase generice de tip java nu pot indica același obiect. Adică să spunem că avem două legături: Pereche obj1 și pereche obj2. Prin urmare, apare o eroare în linia obj1 = obj2. Deși ambele variabile sunt de tip Pair, obiectele la care se referă sunt diferite. Acesta este un exemplu viu de securitate a tipurilor din Java Generic.

Restricții impuse clasei generalizate



Este important să știm că generalizările pot fi aplicate numai tipurilor de referință, adică argumentul transmis parametrului java al clasei generice trebuie să fie neapărat un tip de clasă. Astfel de tipuri simple, de exemplu, duble sau lungi, nu pot fi transmise. Cu alte cuvinte, următoarea linie a declarației Clasa Pair nu este validă: Pereche obj. Cu toate acestea, această limitare nu este o problemă serioasă, deoarece Java are o clasă de împachetare corespunzătoare pentru fiecare tip primitiv. În mod strict vorbind, dacă în clasa Pair doriți să încapsulați o valoare întregă și logică, pachetul auto va face totul pentru dvs.: Pair obj = new Pair<> (25, adevărat).

O altă limitare gravă este imposibilitatea de a crea o instanță a unui parametru de tip. Deci, următoarea linie va provoca o eroare de compilare: T first = new T (). Acest lucru este evident, deoarece nu știți în prealabil dacă o clasă completă sau o interfață abstractă va fi trecută ca argument. Același lucru este valabil și pentru crearea matricelor.

Tipuri limitate

Destul de des există situații în care este necesar să se limiteze lista tipurilor care pot fi transmise ca argument la clasa generică Java. Să presupunem că, în clasa Pair, vrem să încapsulam exclusiv valori numerice pentru operațiile matematice ulterioare pe ele. Pentru a face acest lucru, trebuie să setăm limita superioară a parametrului de tip. Aceasta este implementată utilizând o declarație superclass moștenită de toate argumentele transmise în paranteze unghiulare. Acesta va arata astfel: pereche de clasa. În acest fel, compilatorul învață că în locul parametrului T, puteți înlocui fie clasa numărului, fie una din subclasele sale.

Aceasta este o tehnică comună. Astfel de restricții sunt adesea folosite pentru a asigura compatibilitatea parametrilor de tip din aceeași clasă. Luați în considerare un exemplu pe clasa Pair: clasa Pair. Aici îi spunem compilatorului că tipul T poate fi arbitrar, iar tipul V trebuie să fie tip T sau una dintre subclasele sale.

Restricția "de jos" apare exact în același mod, dar în loc de cuvânt se extinde, se scrie cuvântul super. Aceasta este o pereche de clase spune că în loc de T, fie un ArrayList, fie o clasă sau o interfață pe care o moștenește poate fi înlocuită.

Metode generice Java și constructori

În Java, generalizările pot fi aplicate nu numai în ceea ce privește clasele, ci și metodele. Deci, metoda generalizată poate fi declarată în clasa obișnuită.

metode java generice

După cum puteți vedea în figura de mai sus, nu există nimic complicat în declararea metodei generalizate. Este suficient să introduceți unghiuri înaintea metodei tip retur și să specificați parametrii de tip în ele.

În cazul constructorului, totul se face în același mod:

java de generice de curățare

În acest caz, barele de unghiuri sunt plasate înaintea numelui constructorului, deoarece nu returnează nicio valoare. Rezultatul lucrărilor ambelor programe va fi:

întreg

șir

Distribuiți pe rețelele sociale:

înrudit
Cum se actualizează Java pe sistemele de operare Linux și Windows?Cum se actualizează Java pe sistemele de operare Linux și Windows?
Primul program Java este Hello WorldPrimul program Java este Hello World
Limbaj de programare JavaLimbaj de programare Java
Familia de motociclete `Java-350`Familia de motociclete `Java-350`
"Java-634" - o motocicletă populară din anii șaptezeci"Java-634" - o motocicletă populară din anii șaptezeci
"Java 350-638" - visul motociclistului sovietic"Java 350-638" - visul motociclistului sovietic
Țigarete Java: descriere și tipuriȚigarete Java: descriere și tipuri
Java: expresii regulate, caractere specialeJava: expresii regulate, caractere speciale
Programare: Java. Tipuri de dateProgramare: Java. Tipuri de date
Mediu de dezvoltare integrat JavaMediu de dezvoltare integrat Java
» » Java generice: descriere și metode