java generic array how simulate generic arrays java
Ovaj vodič objašnjava kako simulirati funkcionalnost generičkog niza u Javi pomoću Object Array i također pomoću klase Reflection s jednostavnim primjerom:
Već smo razgovarali Java generički lijekovi u jednom od naših prethodnih vodiča. Java dopušta generičke klase, metode itd. Koje se mogu proglasiti neovisnima o vrstama. Međutim, Java ne dopušta da niz bude generički.
Razlog tome je što u Javi nizovi sadrže informacije povezane sa svojim komponentama i te se informacije koriste za dodjelu memorije tijekom izvođenja. Kada se koriste generički podaci, zbog brisanja tipa, bajt kôd ne sadrži nikakve generičke podatke.
=> Posjetite ovdje da biste naučili Javu ispočetka.
Što ćete naučiti:
Generički niz u Javi
Ako ste definirali generički niz, tada tip komponente neće biti poznat tijekom izvođenja. Stoga nije poželjno definirati nizove kao generičke u Javi.
Definicija generičkog niza prikazana je dolje:
E () newArray = new E(length);
Prevoditelj ne zna točan tip koji treba instancirati jer podaci o tipu nisu dostupni u vrijeme izvođenja.
Dakle, umjesto nizova, kad god su potrebni generički, trebali biste preferirati komponentu popisa okvira Java Collections. Međutim, možete stvoriti generičke strukture slične nizu koristeći objektni niz i odraznu značajku Jave.
Ova dva pristupa koja nam omogućuju definiranje nizova različitih tipova podataka detaljno su objašnjena u nastavku.
najbolji softver za pretvaranje video datoteka
Stvorite i inicijalizirajte generički niz
U ovom odjeljku stvorimo strukturu nalik nizu koja je generičke prirode. Korištenjem ovih struktura moći ćete stvoriti nizove davanjem tipa podataka kao argumenta.
Korištenje Object Array
Ovaj pristup koristi niz objekata Objekti kao član glavne klase niza. Također koristimo metode get / set za čitanje i postavljanje elemenata niza. Zatim instanciramo glavnu klasu polja koja nam omogućuje da pružimo tip podataka prema potrebi.
Ovo simulira generički niz.
Sljedeći program prikazuje upotrebu objektnog polja za stvaranje generičke strukture nalik na niz.
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 Izlaz:
U gore navedenom programu definirali smo klasu Array koja je generička. Niz objekata je član klase koji se instancira pomoću konstruktora i duljine. Također koristimo generičke metode get i set koje se koriste za čitanje i postavljanje elementa niza određenog tipa.
Zatim kreiramo instance ove klase polja. Tijekom stvaranja instanci možemo odrediti željeni tip. U gore navedenom programu stvorili smo dva polja tipa Integer i String, a zatim te nizove popunjavamo odgovarajućim vrijednostima (pomoću metode set).
Konačno, pomoću nadjačane metode 'toString' prikazujemo sadržaj svake od ovih instanci.
Koristeći Reflection
U ovom pristupu koristimo klasu refleksije za stvaranje generičkog niza čiji će tip biti poznat samo u vrijeme izvođenja.
Pristup je sličan prethodnom s samo jednom razlikom, tj. Koristimo klasu odraza u samom konstruktoru za instanciranje niza objekata eksplicitnim prosljeđivanjem podataka o tipu podataka konstruktoru klase.
Ova vrsta informacija prosljeđuje se metodi refleksije Array.newInstance.
Sljedeći program prikazuje upotrebu refleksije za stvaranje generičkog niza . Imajte na umu da je cjelokupna programska struktura slična prethodnom pristupu s samo razlikom u korištenju značajki refleksije.
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 Izlaz:
Gornji program prikazuje nizove dviju vrsta, tj. Integer i String stvorene iz generičke klase Arrays.
Pogreška pri generiranju niza
Već smo razgovarali o implikacijama stvaranja generičkih nizova u Javi i zašto u Javi nije moguće imati generičke nizove. Drugo objašnjenje ovoga je da su nizovi u Javi kovarijantni, dok generički nisu. Generički lijekovi su invarijantni.
Pod kovarijancijom podrazumijevamo da se nizu podtipa može dodijeliti referenca nadtipa.
To znači da će sljedeća izjava dobro funkcionirati.
Number numArray() = new Integer(10);
Kako je Integer podvrsta broja, gornja izjava je u redu.
Ali ako isti koncept koristimo s generičkim lijekovima, to neće raditi, tj. S generičkim lijekovima, ne možemo dodijeliti genetički podtip generičkom nadtipu.
implementirajući graf u c ++
Izjava, ListobjList = novi ArrayList (); dat će pogrešku u kompilaciji jer generički lijekovi nisu kovarijantni poput nizova.
Imajući u vidu gornji razlog, ne možemo imati i nešto poput dolje:
public static ArrayList() myarray = new ArrayList(2);
Ova se izjava neće uspjeti sastaviti s pogreškom, 'Stvaranje generičkog niza' jer ne možemo deklarirati niz referenci na određeni generički tip.
Međutim, možemo stvoriti niz referenci na određeni generički tip pomoću zamjenskog znaka. Gornja izjava može se uspješno sastaviti uz malu promjenu upotrebe zamjenskog znaka kao što je prikazano u nastavku.
public static ArrayListmyarray = new ArrayList(5);
Gornja izjava uspješno će se sastaviti.
Sljedeći program prikazuje demonstraciju upotrebe zamjenskih znakova.
je mrežni sigurnosni ključ isti kao i lozinka
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)); } }
Izlaz:
U gornjem programu imamo prvu izjavu u glavnoj metodi koja ukazuje na nepromjenjivost generičkih lijekova. Ova će izjava upozoriti na pogrešku kompilacije (prikazana u komentarima). Sljedeće stvaranje niza je prema pravilima generičkih podataka i stoga se uspješno kompajliraju.
Često postavljana pitanja
P # 1) Što je generički niz?
Odgovor: Nizovi koji su neovisni o tipu podataka i čija se vrsta podataka procjenjuje tijekom izvođenja su generički nizovi. Generički su predmeti slični C ++.
P # 2) Možete li stvoriti generički niz u Javi?
Odgovor: Nizovi su kovarijantni u Javi, tj. Bilo kojem nizu podrazreda može se dodijeliti niz supertipa. Generički su podaci, međutim, invarijantni, tj. Ne možete dodijeliti polje tipa podklase tipu superklase.
Drugo, generički podaci uklanjaju se iz JVM-a, pa stoga niz čija se dodjela memorije vrši u vrijeme izvođenja ne zna koji će se tip dodijeliti nizu. Stoga se nizovi i generički podaci ne slažu dobro u Javi.
P # 3) Što je tip E u Javi?
Odgovor: djeluje kao rezervirano mjesto za generičke lijekove i predstavlja bilo koju vrstu elemenata.
P # 4) Što je brisanje tipova u Javi?
Odgovor: Proces koji provodi Java kompajler kojim se parametarski tipovi koji se koriste u genericima uklanjaju i preslikavaju na sirove tipove u bajt kodu. Kao takav, bajt kôd ne sadrži nikakve informacije o generičkim lijekovima.
P # 5) Što je sirovi tip u Javi?
Odgovor: Sirovi tipovi su generički tipovi bez upotrebe parametra tipa. Npr. Popis je sirovi tip; dok je Lista parametarski tip.
Zaključak
U Javi se generički niz ne može izravno definirati, tj. Ne možete imati parametarski tip dodijeljen referenci niza. Međutim, koristeći nizove objekata i značajke odraza, možete simulirati stvaranje generičkog niza.
Ova dva pristupa vidjeli smo u ovom vodiču, zajedno s pojedinostima generičke pogreške pri stvaranju niza i mogućnostima da se takva pogreška spriječi. Ukratko, na Javi možete reći da nizovi i generički lijekovi ne idu ruku pod ruku jer su nizovi kovarijantni, dok su generički nepromjenjivi.
=> Ovdje pogledajte Savršeni vodič za Java obuku.
Preporučena literatura
- Java niz - Kako ispisati elemente niza u Javi?
- Vodič za dužinu Java polja s primjerima koda
- Java Vodič za refleksiju s primjerima
- Java Array - Deklariranje, stvaranje i inicijalizacija niza u Javi
- Uvod u Java nizove i srodne koncepte
- Vodič za generičke Java s primjerima
- Java SWING Vodič: Spremnici, komponente i upravljanje događajima
- Java tipovi podataka, petlje, nizovi, prekidači i tvrdnje