java generic array how simulate generic arrays java
Acest tutorial explică modul de simulare a funcționalității matricei generice în Java folosind matrice de obiecte și, de asemenea, folosind clasa de reflecție cu un exemplu simplu:
Am discutat deja Generice Java într-unul din tutorialele noastre anterioare. Java permite clase generice, metode etc. care pot fi declarate independente de tipuri. Cu toate acestea, Java nu permite ca matricea să fie generică.
Motivul pentru aceasta este că în Java, matricile conțin informații legate de componentele lor și aceste informații sunt utilizate pentru a aloca memorie în timp de execuție. Când sunt utilizate generice, din cauza ștergerii tipului, codul de octeți nu conține nicio informație generică.
=> Vizitați aici pentru a afla Java de la zero.
Ce veți învăța:
Matrice generică în Java
Dacă ați definit o matrice generică, atunci tipul de componentă nu va fi cunoscut în timpul rulării. Astfel, nu este recomandabil să definiți matrici ca generice în Java.
O definiție de matrice generică este așa cum se arată mai jos:
E () newArray = new E(length);
Compilatorul nu cunoaște tipul exact care trebuie instanțiat deoarece informațiile despre tip nu sunt disponibile în timpul rulării.
Deci, în loc de matrice, ori de câte ori sunt necesare generice, ar trebui să preferați componenta listă a cadrului Java Collections. Cu toate acestea, puteți crea structuri generice care sunt asemănătoare matricei utilizând matricea de obiecte și caracteristica de reflexie a Java.
Aceste două abordări care ne permit să definim matrici ale diferitelor tipuri de date sunt explicate mai jos în detaliu.
diferența dintre testarea cutiei albe și a cutiei negre
Creați și inițializați matricea generică
În această secțiune, să creăm o structură asemănătoare matricei de natură generică. Folosind aceste structuri, veți putea crea tablouri furnizând tipul de date ca argument.
Utilizarea matricei de obiecte
Această abordare utilizează matricea de obiecte de tip ca membru al clasei matrice principale. De asemenea, folosim metode get / set pentru a citi și seta elementele matrice. Apoi, vom instanția clasa matricei principale care ne permite să furnizăm tipul de date după cum este necesar.
Aceasta simulează matricea generică.
Următorul program demonstrează utilizarea matricei de obiecte pentru a crea o structură generică asemănătoare matricei.
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i Ieșire:
În programul de mai sus, am definit o clasă Array care este generică. Matricea obiect este un membru al clasei care este instanțiat folosind un constructor și o lungime. De asemenea, folosim metodele generice get și set care sunt utilizate pentru a citi și seta un element matrice de un anumit tip.
Apoi creăm instanțe ale acestei clase de matrice. În timp ce creăm instanțe, putem specifica tipul dorit. În programul de mai sus, am creat două matrice de tip Integer și String și apoi populăm aceste matrice cu valori adecvate (folosind metoda set).
În cele din urmă, folosind metoda „toString” suprascrisă, afișăm conținutul fiecăreia dintre aceste instanțe.
Folosind Reflection
În această abordare, folosim o clasă de reflecție pentru a crea un tablou generic al cărui tip va fi cunoscut doar la runtime.
Abordarea este similară celei anterioare, cu o singură diferență, adică folosim clasa de reflecție în constructorul însuși pentru a instanția o matrice de obiecte, trecând în mod explicit informațiile despre tipul de date către constructorul clasei.
Acest tip de informații este transmis metodei de reflecție Array.newInstance.
ce face un beta tester
Următorul program arată utilizarea reflexiei pentru a crea o matrice generică . Rețineți că întreaga structură a programului este similară abordării anterioare, cu doar diferența în utilizarea caracteristicilor de reflexie.
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i Ieșire:
Programul de mai sus prezintă matrici de două tipuri, adică Integer și String create din clasa generică Arrays.
Eroare generică la crearea matricei
Am discutat deja despre implicațiile creării matricelor generice în Java și de ce nu este posibil să avem tablouri generice în Java. O altă explicație este că matricile în Java sunt covariante, în timp ce genericele nu. Genericele sunt invariante.
Prin covarianță, înțelegem că o matrice a subtipului poate fi atribuită referinței sale de supertip.
Aceasta înseamnă că următoarea declarație va funcționa bine.
Number numArray() = new Integer(10);
Deoarece Integer este un subtip de Number, declarația de mai sus se compilează bine.
Dar dacă folosim același concept cu generice, acesta nu va funcționa, adică cu generice, nu putem atribui subtip generic unui generic supertip.
Declarația, ListobjList = new ArrayList (); va da o eroare de compilare, deoarece genericele nu sunt covariante ca matrice.
Ținând cont de motivul de mai sus, nu putem avea și ceva de genul de mai jos:
public static ArrayList() myarray = new ArrayList(2);
Această declarație nu va putea fi compilată cu eroarea, „Crearea matricei generice” deoarece nu putem declara o serie de referințe la un anumit tip generic.
Cu toate acestea, putem crea o serie de referințe la un anumit tip generic folosind metacaracterul. Afirmația de mai sus poate fi compilată cu succes, cu o ușoară modificare a utilizării unui wildcard, așa cum se arată mai jos.
public static ArrayListmyarray = new ArrayList(5);
Afirmația de mai sus se va compila cu succes.
Următorul program prezintă o demonstrație a utilizării comodinelor.
cel mai bun blocator de anunțuri pop-up pentru Chrome
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
Ieșire:
În programul de mai sus, avem prima afirmație din metoda principală care indică invarianța genericelor. Această declarație va afișa eroarea de compilare (prezentată în comentarii). Următoarea creare a matricei este conform regulilor generice și astfel se compilează cu succes.
întrebări frecvente
Q # 1) Ce este o matrice generică?
Răspuns: Tablourile care sunt independente de tipul de date și al căror tip de informație este evaluat la runtime sunt tablouri generice. Genericele sunt similare cu șabloanele din C ++.
Q # 2) Puteți crea o matrice generică în Java?
Răspuns: Matricile sunt covariante în Java, adică orice matrice de subclasă poate fi atribuită unui tablou de supertip. Cu toate acestea, genericele sunt invariante, adică nu puteți atribui matrice de tip subclasă tipului de superclasă.
În al doilea rând, informațiile generice sunt eliminate din JVM și, astfel, tabloul a cărui alocare de memorie se face în timp de execuție nu știe ce tip trebuie atribuit tabloului. Astfel, matricile și genericele nu merg bine împreună în Java.
Q # 3) Ce este tipul E în Java?
Răspuns: acționează ca un substituent pentru generice și reprezintă orice tip de element.
Q # 4) Ce este Type Erasure în Java?
Răspuns: Un proces realizat de compilatorul Java prin care tipurile parametrizate utilizate în generice sunt eliminate și mapate la tipuri brute în cod de octeți. Ca atare, codul de octeți nu conține informații despre generice.
Q # 5) Ce este un tip Raw în Java?
Răspuns: Tipurile raw sunt tipuri generice fără a utiliza parametrul type. De exemplu. Lista este un tip brut; întrucât Lista este un tip parametrizat.
Concluzie
În Java, matricea generică nu poate fi definită direct, adică nu puteți avea un tip parametrizat atribuit unei referințe de matrice. Cu toate acestea, utilizând matrici de obiecte și caracteristici de reflexie, puteți simula crearea de matrice generică.
Am văzut aceste două abordări în acest tutorial, împreună cu detaliile erorii generice de creare a matricii și posibilitățile de a preveni o astfel de eroare. Pe scurt, în Java, puteți spune că matricele și genericele nu merg mână în mână, deoarece matricile sunt covariante, în timp ce genericele sunt invariante.
=> Consultați aici Ghidul perfect de instruire Java.
Lectură recomandată
- Java Array - Cum se imprimă elemente ale unui array în Java?
- Tutorial Java Array Length cu exemple de cod
- Tutorial de reflecție Java cu exemple
- Java Array - Declarați, creați și inițializați o matrice în Java
- Introducere în matrice Java și concepte conexe
- Tutorial Java Generics cu exemple
- Tutorial Java SWING: Container, componente și gestionarea evenimentelor
- Tipuri de date Java, bucle, tablouri, comutatoare și afirmații