java generic array how simulate generic arrays java
Ta vadnica pojasnjuje, kako simulirati funkcionalnost generičnega polja v Javi s pomočjo objektnega polja in tudi z uporabo razreda odsev s preprostim primerom:
Smo že razpravljali Java generiki v enem od naših prejšnjih vadnic. Java omogoča generične razrede, metode itd., Ki jih je mogoče razglasiti za neodvisne od vrst. Vendar Java ne dovoljuje, da bi bila matrika splošna.
Razlog za to je, da v Javi polja vsebujejo informacije, povezane s svojimi komponentami, in te informacije se uporabljajo za dodeljevanje pomnilnika med izvajanjem. Ko se generiki uporabljajo zaradi izbrisa tipa, bajtna koda ne vsebuje nobenih generičnih informacij.
=> Obiščite tukaj, če se želite naučiti Jave iz nič.
Kaj se boste naučili:
Splošno polje v Javi
Če ste definirali generično matriko, vrsta komponente med izvajanjem ne bo znana. Zato ni priporočljivo, da polja v Javi definirate kot generična.
Definicija generičnega polja je prikazana spodaj:
E () newArray = new E(length);
Prevajalnik ne pozna natančnega tipa, ki naj bi ga ustvarili, saj informacije o tipu med izvajanjem niso na voljo.
Torej namesto nizov, kadar koli so potrebni generiki, raje izberite komponento seznama v okviru zbirk Java. Lahko pa ustvarite generične strukture, ki so podobne matriki, z uporabo objektnega polja in odsevne funkcije Java.
Ta dva pristopa, ki nam omogočata definiranje nizov različnih tipov podatkov, sta podrobno pojasnjena v nadaljevanju.
kaj so metapodatki v podatkovnem skladišču
Ustvarite in inicializirajte generično matriko
V tem razdelku ustvarimo matrično strukturo, ki je generične narave. Z uporabo teh struktur boste lahko ustvarili nize, tako da boste kot argument podali podatkovni tip.
Uporaba Object Array
Ta pristop uporablja matriko Objects kot člana glavnega razreda matrike. Za branje in nastavljanje elementov matrike uporabljamo tudi metode get / set. Nato primerimo glavni matrični razred, ki nam omogoča, da po potrebi zagotovimo podatkovni tip.
To simulira generično matriko.
Naslednji program prikazuje uporabo objektnega polja za ustvarjanje generične strukture, podobne matriki.
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 Izhod:

V zgornjem programu smo definirali razred Array, ki je generičen. Matrika predmetov je član razreda, ki se ustvari s pomočjo konstruktorja in dolžine. Uporabljamo tudi splošne metode get in set, ki se uporabljajo za branje in nastavitev elementa matrike določene vrste.
Nato ustvarimo primerke tega polja matrike. Med ustvarjanjem primerkov lahko določimo želeni tip. V zgornjem programu smo ustvarili dve vrsti tipa Integer in String, nato pa te nize zapolnimo z ustreznimi vrednostmi (z uporabo metode set).
Na koncu z uporabo razveljavljene metode 'toString' prikažemo vsebino vsakega od teh primerov.
Uporaba Reflection
Pri tem pristopu uporabljamo odsevni razred za ustvarjanje generičnega polja, katerega tip bo znan šele med izvajanjem.
Pristop je podoben prejšnjemu z le eno razliko, tj.v razredu odsevov v samem konstruktorju ustvarimo primer objekta z eksplicitnim posredovanjem podatkov o podatkovnem tipu konstruktorju razreda.
Ta vrsta informacij se posreduje metodi odseva Array.newInstance.
Naslednji program prikazuje uporabo odseva za ustvarjanje generičnega polja . Upoštevajte, da je celotna zgradba programa podobna prejšnjemu pristopu, le z razliko v uporabi odsevnih funkcij.
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 Izhod:

Zgornji program prikazuje matrike dveh vrst, torej Integer in String, ustvarjene iz generičnega razreda Arrays.
Napaka pri ustvarjanju generičnega polja
Že smo razpravljali o posledicah ustvarjanja generičnih nizov v Javi in zakaj v Javi ni mogoče imeti generičnih nizov. Druga razlaga za to je, da so nizi v Javi kovarianti, generiki pa ne. Generiki so nespremenljivi.
S kovarianco mislimo, da je matriko podtipa mogoče dodeliti referenci nadtipa.
To pomeni, da bo naslednja izjava dobro delovala.
kaj je datoteka .swf?
Number numArray() = new Integer(10);
Ker je Integer podvrsta Number, je zgornja izjava v redu.
Če pa uporabimo isti koncept z generičnimi zdravili, to ne bo delovalo, tj.z generičnimi zdravili ne moremo dodeliti podtipa generičnega nadtipu generičnega.
Stavek ListobjList = new ArrayList (); bo dal napako pri sestavljanju, ker generiki niso kovariante kot nizi.
Ob upoštevanju zgornjega razloga tudi v nadaljevanju ne moremo imeti nekaj takega:
public static ArrayList() myarray = new ArrayList(2);
Ta izjava se ne bo sestavila z napako, 'Ustvarjanje generičnega polja' saj ne moremo prijaviti niza sklicev na določen generični tip.
Lahko pa z nadomestnimi znaki ustvarimo vrsto referenc na določen generični tip. Zgornjo izjavo lahko uspešno sestavite z rahlo spremembo uporabe nadomestnega znaka, kot je prikazano spodaj.
public static ArrayListmyarray = new ArrayList(5);
Zgornja izjava bo uspešno prevedena.
Naslednji program prikazuje demonstracijo uporabe nadomestnih znakov.
najboljša programska oprema za Windows 10
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)); } }
Izhod:

V zgornjem programu imamo prvo izjavo v glavni metodi, ki označuje nespremenljivost generikov. Ta izjava bo utripala pri napaki prevajanja (prikazana v komentarjih). Naslednje ustvarjanje matrike je v skladu s pravili generikov, zato se uspešno prevedejo.
Pogosto zastavljena vprašanja
V # 1) Kaj je generično polje?
Odgovor: Polja, ki so neodvisna od podatkovnega tipa in katerih vrsta informacij se oceni med izvajanjem, so generična polja. Generiki so podobni predlogam v jeziku C ++.
V # 2) Ali lahko v Javi ustvarite generično matriko?
Odgovor: Polji so v Java kovarijantni, kar pomeni, da je poljubnemu polju podrazredov mogoče dodeliti matriko nadtipa. Generiki pa so nespremenljivi, tj. Tipu podrazreda ne morete dodeliti tipa superrazreda.
Drugič, generične informacije se odstranijo iz JVM, zato matrika, katere dodelitev pomnilnika se izvede med izvajanjem, ne ve, kateri tip naj bo dodeljen matriki. Tako se nizi in generiki v Javi ne ujemajo.
V # 3) Kaj je tip E v Javi?
Odgovor: deluje kot ograda za generike in predstavlja katero koli vrsto elementov.
V # 4) Kaj je izbris tipa v Javi?
Odgovor: Proces, ki ga izvaja prevajalnik Java, s katerim se parametrizirani tipi, ki se uporabljajo v generikih, odstranijo in preslikajo na surove tipe v bajtni kodi. Bajtna koda kot taka ne vsebuje nobenih informacij o generikih.
V # 5) Kaj je surova vrsta v Javi?
Odgovor: Surovi tipi so splošni tipi brez uporabe parametra tipa. Npr. Seznam je surov tip; ker je seznam parametriziran tip.
Zaključek
V Javi generičnega polja ni mogoče definirati neposredno, torej ne morete imeti parametriziranega tipa, dodeljenega sklicu na matriko. Vendar pa lahko z uporabo nizov objektov in odsevnih funkcij simulirate generično ustvarjanje matrike.
Ta dva pristopa smo videli v tej vadnici, skupaj s podrobnostmi o generični napaki pri ustvarjanju matrike in možnostmi, da takšno napako preprečimo. Na kratko, na Javi lahko rečete, da nizi in generiki ne gredo z roko v roki, saj so nizi kovarianti, generiki pa invariantni.
=> Tukaj si oglejte Perfect Guide Training Guide.
Priporočeno branje
- Java Array - Kako natisniti elemente polja v Javi?
- Vadnica za dolžino polja Java s primeri kode
- Vadnica za refleksijo Java s primeri
- Java Array - prijavite, ustvarite in inicializirajte polje v Javi
- Uvod v nize Java in sorodne koncepte
- Java Generics Vadnica s primeri
- Java SWING Vadnica: Vsebnik, komponente in obdelava dogodkov
- Java vrste podatkov, zanke, nizi, stikala in trditve