java generic array how simulate generic arrays java
Denne vejledning forklarer, hvordan man simulerer funktionaliteten af generisk matrix i Java ved hjælp af Object Array og også ved hjælp af Reflection Class med et simpelt eksempel:
Vi har allerede diskuteret Java generics i en af vores tidligere tutorials. Java tillader generiske klasser, metoder osv., Der kan erklæres uafhængige af typer. Java tillader imidlertid ikke arrayet at være generisk.
Årsagen til dette er, at i Java indeholder arrays information relateret til deres komponenter, og denne information bruges til at allokere hukommelse ved kørsel. Når generiske stoffer bruges, på grund af sletning af typen, indeholder bytekoden ingen generiske oplysninger.
=> Besøg her for at lære Java fra bunden.
Hvad du lærer:
Generisk matrix i Java
Hvis du har defineret et generisk array, vil komponenttypen ikke være kendt under kørsel. Det er således ikke tilrådeligt at definere arrays som generiske i Java.
En generisk matrixdefinition er som vist nedenfor:
E () newArray = new E(length);
Compileren kender ikke den nøjagtige type, der skal instantieres, da typeoplysningerne ikke er tilgængelige under kørsel.
Så i stedet for arrays, når generiske kræves, skal du foretrække listekomponenten i Java Collections-rammen. Du kan dog oprette generiske strukturer, der er array-lignende ved hjælp af objekt array og refleksionsfunktion i Java.
Disse to tilgange, der giver os mulighed for at definere arrays af forskellige datatyper, forklares nedenfor detaljeret.
hvad er forskellen mellem kvalitetssikring og kvalitetskontrol
Opret og initialiser den generiske matrix
I dette afsnit skal vi oprette en matrixlignende struktur, der er generisk. Ved hjælp af disse strukturer vil du være i stand til at oprette arrays ved at angive datatypen som et argument.
Brug af Object Array
Denne tilgang bruger matrixen af typen Objekter som medlem af den vigtigste matrixklasse. Vi bruger også get / set-metoder til at læse og indstille arrayelementerne. Derefter instantierer vi den vigtigste array-klasse, der giver os mulighed for at levere datatypen efter behov.
Dette simulerer det generiske array.
Det følgende program demonstrerer brugen af objektmatrix til at oprette en generisk matrixlignende struktur.
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 Produktion:

I ovenstående program har vi defineret en klassearray, der er generisk. Objektarrayet er et medlem af klassen, der instantieres ved hjælp af en konstruktør og længde. Vi bruger også de generiske get and set-metoder, der bruges til at læse og indstille et array-element af en bestemt type.
Derefter opretter vi forekomster af denne matrixklasse. Mens vi opretter forekomster, kan vi specificere den ønskede type. I ovenstående program har vi oprettet to arrays af typen Integer og String, og derefter udfylder vi disse arrays med passende værdier (ved hjælp af indstillingsmetoden).
Endelig ved hjælp af den tilsidesatte 'toString'-metode viser vi indholdet af hver af disse forekomster.
Brug af refleksion
I denne tilgang bruger vi en reflektionsklasse til at oprette et generisk array, hvis type kun vil være kendt under kørsel.
Fremgangsmåden svarer til den forrige med kun en forskel, dvs. vi bruger refleksionsklasse i konstruktøren selv til at instantiere et objektarray ved eksplicit at videregive datatypen til klassekonstruktøren.
Denne type information videregives til Array.newInstance-refleksionsmetoden.
Det følgende program viser brugen af refleksion for at skabe et generisk array . Bemærk, at hele programstrukturen svarer til den tidligere tilgang med kun forskellen i brugen af refleksionsfunktioner.
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 Produktion:

download alle videoer fra youtube-spillelisten
Ovenstående program viser arrays af to typer, dvs. heltal og streng oprettet fra Arrays generiske klasse.
Generisk Array Creation Error
Vi har allerede diskuteret konsekvenserne af at oprette generiske arrays i Java, og hvorfor det ikke er muligt at have generiske arrays i Java. En anden forklaring på dette er, at arrays i Java er kovariante, mens generics ikke er det. Generiske stoffer er uforanderlige.
Ved kovarians mener vi, at en matrix af undertypen kan tildeles dens supertypereference.
Dette betyder, at følgende udsagn fungerer fint.
Number numArray() = new Integer(10);
Da heltal er en undertype af tal, kompilerer ovenstående udsagn fint.
Men hvis vi bruger det samme koncept med generics, fungerer det ikke, dvs. med generics, vi kan ikke tildele subtype generic til en supertype generic.
Erklæringen, ListobjList = ny ArrayList (); vil give en kompileringsfejl, da generiske stoffer ikke er ensvarige som arrays.
Når vi holder ovennævnte grund i tankerne, kan vi ikke have noget som nedenfor også:
public static ArrayList() myarray = new ArrayList(2);
Denne erklæring kan ikke kompileres med fejlen, “Oprettelse af generisk matrix” da vi ikke kan erklære en række referencer til en bestemt generisk type.
Vi kan dog oprette en række referencer til en bestemt generisk type ved hjælp af jokertegn. Ovenstående erklæring kan kompileres med succes med en lille ændring af brugen af et jokertegn som vist nedenfor.
public static ArrayListmyarray = new ArrayList(5);
Ovenstående erklæring kompileres med succes.
Det følgende program viser en demonstration af brugen af jokertegn.
vr, der fungerer med xbox one
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)); } }
Produktion:

I ovenstående program har vi den første erklæring i hovedmetoden, der indikerer uforanderlighed af generiske lægemidler. Denne erklæring blinker kompileringsfejlen (vist i kommentarer). Den næste array-oprettelse er ifølge generiske regler, og dermed kompileres de med succes.
Ofte stillede spørgsmål
Q # 1) Hvad er en generisk matrix?
Svar: Arrays, der er uafhængige af datatypen, og hvis type information evalueres ved kørsel, er generiske arrays. Generiske er magen til skabeloner i C ++.
Q # 2) Kan du oprette en generisk matrix i Java?
Svar: Arrays er covariante i Java, dvs. ethvert underklassearray kan tildeles et supertypearray. Generiske er imidlertid uændrede, dvs. du kan ikke tildele underklassetypearray til superklassetype.
For det andet fjernes generiske oplysninger fra JVM, og arrayet, hvis hukommelsesallokering udføres ved kørselstid, ved ikke, hvilken type der skal tildeles arrayet. Således går arrays og generics ikke godt sammen i Java.
Q # 3) Hvad er type E i Java?
Svar: fungerer som en pladsholder for generiske stoffer og repræsenterer enhver type element.
Spørgsmål nr. 4) Hvad er type sletning i Java?
Svar: En proces udført af Java-kompilator, hvor de parametriserede typer, der bruges i generiske, fjernes og kortlægges til råtyper i bytekode. Som sådan indeholder bytekoden ingen information om generiske stoffer.
Q # 5) Hvad er en rå type i Java?
Svar: Rå typer er generiske typer uden brug af typeparameteren. For eksempel. Liste er en rå type; mens List er en parametreret type.
Konklusion
I Java kan det generiske array ikke defineres direkte, dvs. du kan ikke have en parametreret type tildelt en array-reference. Men ved hjælp af objektarrays og refleksionsfunktioner kan du simulere generisk array-oprettelse.
Vi har set disse to tilgange i denne vejledning sammen med detaljerne i generisk array-oprettelsesfejl og mulighederne for at forhindre en sådan fejl. I en nøddeskal kan du i Java sige, at arrays og generika ikke går hånd i hånd, da arrays er covariante, mens generics er invariante.
=> Tjek den perfekte Java-træningsvejledning her.
Anbefalet læsning
- Java Array - Hvordan udskrives elementer af en matrix i Java?
- Java Array Length Tutorial med kodeeksempler
- Java Reflection Tutorial med eksempler
- Java Array - Erklære, oprette og initialisere en matrix i Java
- Introduktion til Java Arrays og relaterede koncepter
- Java Generics-tutorial med eksempler
- Java SWING Tutorial: Container, komponenter og håndtering af begivenheder
- Java datatyper, sløjfer, arrays, switch og påstande