java generic array how simulate generic arrays java
V tomto výučbe sa dozviete, ako simulovať funkčnosť generického poľa v Jave pomocou objektového poľa a tiež pomocou triedy odrazu s jednoduchým príkladom:
Už sme diskutovali Java generiká v jednom z našich predchádzajúcich tutoriálov. Java umožňuje generické triedy, metódy atď., Ktoré je možné deklarovať nezávisle od typov. Java však neumožňuje, aby bolo pole všeobecné.
Dôvodom je to, že v Jave obsahujú polia informácie týkajúce sa ich komponentov a tieto informácie sa používajú na pridelenie pamäte za behu. Keď sa použijú generické typy, z dôvodu vymazania typu bajtový kód neobsahuje žiadne všeobecné informácie.
=> Navštívte tu a dozviete sa Java od začiatku.
Čo sa dozviete:
Generické pole v Jave
Ak ste definovali všeobecné pole, potom nebude typ komponentu za behu známy. Preto nie je vhodné definovať polia ako všeobecné v Jave.
Definícia generického poľa je uvedená nižšie:
E [] newArray = new E[length];
Kompilátor nepozná presný typ, ktorý sa má vytvoriť, pretože informácie o type nie sú za behu k dispozícii.
Takže namiesto polí, vždy, keď sa vyžaduje generika, by ste mali uprednostniť komponent zoznamu v rámci rámca zbierok Java. Generické štruktúry, ktoré sú podobné poliam, však môžete vytvoriť pomocou matice objektov a odrazu v Jave.
Tieto dva prístupy, ktoré nám umožňujú definovať polia rôznych dátových typov, sú podrobne vysvetlené nižšie.
ako zvládnuť vyskakovacie okno v selenovom webdriveri -
Vytvorte a inicializujte generické pole
V tejto časti vytvorme štruktúru podobnú poli, ktorá má všeobecnú povahu. Pomocou týchto štruktúr budete môcť vytvoriť polia poskytnutím dátového typu ako argumentu.
Pomocou Object Array
Tento prístup používa pole typu Objekty ako člena triedy hlavných polí. Na čítanie a nastavovanie prvkov poľa používame tiež metódy get / set. Potom vytvoríme inštanciu triedy hlavného poľa, ktorá nám umožňuje poskytnúť dátový typ podľa potreby.
To simuluje všeobecné pole.
Nasledujúci program demonštruje použitie objektového poľa na vytvorenie všeobecnej štruktúry podobnej poľa.
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 Výkon:

Vo vyššie uvedenom programe sme definovali triedu Array, ktorá je všeobecná. Pole objektov je členom triedy, ktorá je vytvorená inštanciou pomocou konštruktora a dĺžky. Používame tiež všeobecné metódy get a set, ktoré sa používajú na čítanie a nastavenie prvku poľa konkrétneho typu.
oops koncept v C # s príkladom
Potom vytvoríme inštancie tejto triedy polí. Pri vytváraní inštancií môžeme určiť požadovaný typ. Vo vyššie uvedenom programe sme vytvorili dve polia typu Integer a String a tieto polia potom vyplníme príslušnými hodnotami (metódou set).
Nakoniec pomocou prepísanej metódy „toString“ zobrazíme obsah každej z týchto inštancií.
Pomocou Reflexie
V tomto prístupe používame triedu odrazu na vytvorenie generického poľa, ktorého typ bude známy iba za behu programu.
Prístup je podobný predchádzajúcemu s iba jedným rozdielom, t. J. V samotnom konštruktore používame triedu odrazu na vytvorenie inštancie poľa objektov explicitným odovzdaním informácií o dátovom type konštruktoru triedy.
Tento typ informácií sa odovzdáva metóde odrazu Array.newInstance.
Nasledujúci program ukazuje použitie odrazu na vytvorenie generického poľa . Všimnite si, že celá programová štruktúra je podobná predchádzajúcemu prístupu, len s rozdielom v použití funkcií odrazu.
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 Výkon:

Vyššie uvedený program zobrazuje polia dvoch typov, tj. Celé číslo a reťazec vytvorené z generickej triedy polí.
Chyba pri vytváraní generického poľa
Už sme diskutovali o dôsledkoch vytvárania generických polí v Jave a o tom, prečo nie je možné mať generické polia v Jave. Ďalším vysvetlením je to, že polia v Jave sú kovariantné, zatiaľ čo generické nie. Generiká sú nemenné.
Pod kovarianciou máme na mysli to, že k jeho odkazu na supertyp je možné priradiť pole podtypu.
To znamená, že nasledujúce vyhlásenie bude fungovať dobre.
Number numArray[] = new Integer[10];
Pretože celé číslo je podtypom čísla, vyššie uvedený príkaz je v poriadku.
Ak ale použijeme rovnaký koncept s generikami, nebude to fungovať, t. J. S generikami, nemôžeme priradiť druhový druh k druhovému supertypu.
Príkaz ListobjList = new ArrayList (); dá chybu kompilácie, pretože generiká nie sú kovariantné ako polia.
Berúc do úvahy vyššie uvedený dôvod, nemôžeme mať ani niečo podobné ako nižšie:
public static ArrayList[] myarray = new ArrayList[2];
Toto vyhlásenie sa nepodarí skompilovať s chybou, „Generic array creation“ pretože nemôžeme deklarovať pole odkazov na konkrétny všeobecný typ.
Môžeme však vytvoriť zástup odkazov na konkrétny všeobecný typ pomocou zástupných znakov. Vyššie uvedené vyhlásenie je možné úspešne zostaviť s miernou zmenou použitia zástupného znaku, ako je uvedené nižšie.
public static ArrayListmyarray = new ArrayList[5];
Vyššie uvedené vyhlásenie sa úspešne zostaví.
Nasledujúci program ukazuje demonštráciu použitia zástupných znakov.
fáza implementácie v životnom cykle vývoja softvéru
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]); } }
Výkon:

Vo vyššie uvedenom programe máme prvé vyhlásenie v hlavnej metóde, ktoré označuje invariantnosť generík. Toto vyhlásenie bude blikať chybou kompilácie (zobrazené v komentároch). Ďalšie vytváranie polí je podľa pravidiel generík, a preto sa úspešne kompilujú.
často kladené otázky
Otázka č. 1) Čo je to generické pole?
Odpoveď: Polia, ktoré sú nezávislé od dátového typu a ktorých typ informácií sa vyhodnocuje za behu, sú generické polia. Generické sú podobné ako šablóny v C ++.
Otázka č. 2) Môžete vytvoriť generické pole v Jave?
Odpoveď: Polia sú v Jave kovariantné, t. J. K poli supertypu je možné priradiť akékoľvek pole podtriedy. Generické sú však invariantné, to znamená, že nemôžete priradiť pole typu podtriedy k typu nadtriedy.
Po druhé, generické informácie sú odstránené z JVM, a teda pole, ktorého alokácia pamäte sa vykonáva za behu, nevie, ktorý typ sa má poli priradiť. Pole a generické typy teda v Jave nejdú dokopy.
Otázka 3) Čo je typ E v Jave?
Odpoveď: funguje ako zástupný znak pre generiká a predstavuje akýkoľvek typ prvku.
Otázka č. 4) Čo je vymazanie typu v Jave?
Odpoveď: Proces vykonávaný kompilátorom Java, pomocou ktorého sa odstránia parametrizované typy používané v generike a mapujú sa na surové typy v bajtovom kóde. Bajtový kód ako taký neobsahuje žiadne informácie o generikách.
Otázka č. 5) Čo je to surový typ v Jave?
Odpoveď: Nespracované typy sú všeobecné typy bez použitia parametra type. Napr. Zoznam je surového typu; zatiaľ čo Zoznam je parametrizovaný typ.
Záver
V Jave nemožno generické pole definovať priamo, t. J. Nemôžete mať priradený parametrizovaný typ k odkazu na pole. Pomocou polí a reflexných prvkov objektov však môžete simulovať vytváranie generického poľa.
Tieto dva prístupy sme videli v tomto tutoriále spolu s podrobnosťami o chybe pri vytváraní generického poľa a možnosťami, ako takejto chybe zabrániť. Stručne povedané, v Jave môžete povedať, že polia a generiká nejdú ruka v ruke, pretože polia sú kovariantné, zatiaľ čo generické sú invariantné.
=> Vyskúšajte tu Sprievodcu dokonalým školením Java.
Odporúčané čítanie
- Java Array - Ako tlačiť prvky poľa v Jave?
- Výukový program Java Array Length s príkladmi kódu
- Výukový program Java Reflection s príkladmi
- Java Array - Deklarovať, vytvoriť a inicializovať pole v Jave
- Úvod do Java polí a súvisiacich konceptov
- Výukový program Java Generics s príkladmi
- Výukový program Java SWING: Kontajnery, komponenty a spracovanie udalostí
- Java dátové typy, slučky, polia, prepínače a tvrdenia