java generic array how simulate generic arrays java
Denne opplæringen forklarer hvordan du kan simulere funksjonaliteten til generisk matrise i Java ved hjelp av Object Array og også bruke refleksjonsklasse med enkelt eksempel:
Vi har allerede diskutert Java generics i en av våre tidligere veiledninger. Java tillater generiske klasser, metoder osv. Som kan erklæres uavhengig av typer. Java tillater imidlertid ikke matrisen å være generisk.
Årsaken til dette er at i Java inneholder matriser informasjon relatert til komponentene deres, og denne informasjonen brukes til å fordele minne ved kjøretid. Når generiske legemidler brukes, på grunn av type sletting, inneholder ikke byte-koden noen generisk informasjon.
=> Besøk her for å lære Java fra bunnen av.
Hva du vil lære:
Generisk matrise i Java
Hvis du har definert en generisk matrise, vil ikke komponenttypen være kjent under kjøretid. Derfor er det ikke tilrådelig å definere matriser som generiske i Java.
En generisk matrisedefinisjon er som vist nedenfor:
E () newArray = new E(length);
Kompilatoren vet ikke den nøyaktige typen som skal instansieres, siden typeinformasjonen ikke er tilgjengelig under kjøretid.
Så i stedet for matriser, bør du foretrekke listekomponenten i Java Collections-rammeverket når generikk er påkrevd. Du kan imidlertid lage generiske strukturer som er array-lignende ved hjelp av objekt array og refleksjon funksjonen i Java.
Disse to tilnærmingene som lar oss definere matriser av forskjellige datatyper blir forklart nedenfor i detalj.
c ++ tilfeldig tallgenerator mellom to tall
Opprett og initialiser generisk matrise
I denne delen, la oss lage en matrellignende struktur som er generisk. Ved å bruke disse strukturene vil du kunne lage matriser ved å oppgi datatypen som et argument.
Bruke Object Array
Denne tilnærmingen bruker matrisen av typen Objekter som medlem av hovedmatriseklassen. Vi bruker også get / set-metoder for å lese og sette arrayelementene. Deretter instanserer vi hovedmatriseklassen som lar oss oppgi datatypen etter behov.
Dette simulerer den generiske matrisen.
Det følgende programmet demonstrerer bruken av objektmatrise for å lage en generisk matrellignende 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 Produksjon:
I programmet ovenfor har vi definert et klassearray som er generisk. Objektmatrisen er et medlem av klassen som blir instantiert ved hjelp av en konstruktør og lengde. Vi bruker også generiske get and set-metoder som brukes til å lese og sette et array-element av en bestemt type.
Deretter lager vi forekomster av denne matrixklassen. Mens vi oppretter forekomster, kan vi spesifisere ønsket type. I det ovennevnte programmet har vi opprettet to matriser av typen Integer og String, og deretter fyller vi disse matriser med passende verdier (ved hjelp av settmetoden).
Til slutt bruker vi den overstyrte 'toString'-metoden, og vi viser innholdet i hver av disse forekomstene.
Bruke refleksjon
I denne tilnærmingen bruker vi en refleksjonsklasse for å lage en generisk matrise hvis type bare vil være kjent under kjøretid.
Tilnærmingen er lik den forrige med bare en forskjell, det vil si at vi bruker refleksjonsklasse i selve konstruktøren for å instantiere en objektmatrise ved eksplisitt å overføre datatypeinformasjonen til klassekonstruktøren.
Denne typen informasjon overføres til Array.newInstance-refleksjonsmetoden.
Følgende program viser bruken av refleksjon for å lage en generisk matrise . Merk at hele programstrukturen er lik den forrige tilnærmingen, med bare forskjellen i bruken av refleksjonsfunksjoner.
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 Produksjon:
Ovennevnte program viser matriser av to typer, dvs. heltall og streng opprettet fra generisk klasse Arrays.
hvordan du spiller shockwave flash-objekter
Generisk feil ved opprettelse av matrise
Vi har allerede diskutert implikasjonene av å lage generiske matriser i Java og hvorfor det ikke er mulig å ha generiske matriser i Java. En annen forklaring på dette er at matriser i Java er kovariante, mens generiske ikke er det. Generiske er uforanderlige.
Med kovarians mener vi at en matrise av undertypen kan tilordnes til supertypereferansen.
Dette betyr at følgende påstand vil fungere bra.
Number numArray() = new Integer(10);
Ettersom Heltall er en undertype av Antall, kompileres utsagnet ovenfor fint.
Men hvis vi bruker det samme konseptet med generiske, vil det ikke fungere, dvs. med generiske, vi kan ikke tilordne undertype generisk til en supertype generisk.
Uttalelsen, ListobjList = new ArrayList (); vil gi en kompileringsfeil ettersom generiske stoffer ikke er samvariante som matriser.
Med tanke på ovennevnte årsak kan vi ikke ha noe som nedenfor også:
public static ArrayList() myarray = new ArrayList(2);
Denne uttalelsen vil ikke kompilere med feilen, “Generisk arrayoppretting” da vi ikke kan erklære en rekke referanser til en bestemt generisk type.
Vi kan imidlertid lage en rekke referanser til en bestemt generisk type ved hjelp av jokertegn. Ovennevnte uttalelse kan kompileres med hell med en liten endring av å bruke et jokertegn som vist nedenfor.
public static ArrayListmyarray = new ArrayList(5);
Ovennevnte uttalelse vil bli vellykket.
Følgende program viser en demonstrasjon av bruk av jokertegn.
manuell testing intervju spørsmål og svar for 3 års erfaring
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)); } }
Produksjon:
I det ovennevnte programmet har vi den første setningen i hovedmetoden som indikerer invariansen av generiske stoffer. Denne uttalelsen vil blinke kompileringsfeilen (vist i kommentarene). Neste opprettelse av matriser er i henhold til reglene for generiske, og dermed kompilerer de vellykket.
ofte stilte spørsmål
Q # 1) Hva er en generisk matrise?
Svar: Arrays som er uavhengige av datatypen og hvis type informasjon blir evaluert i løpetid, er generiske arrays. Generiske er lik maler i C ++.
Q # 2) Kan du lage en generisk matrise i Java?
Svar: Arrays er samvariante i Java, dvs. hvilken som helst underklassmatrise kan tilordnes en supertypematrise. Generiske er imidlertid uforanderlige, det vil si at du ikke kan tilordne underklassetypearray til superklassetype.
For det andre fjernes generisk informasjon fra JVM, og dermed vet ikke matrisen hvis minnetildeling gjøres ved kjøretid, hvilken type som skal tilordnes matrisen. Dermed passer ikke matriser og generiske produkter godt sammen i Java.
Q # 3) Hva er type E i Java?
Svar: fungerer som en plassholder for generiske stoffer og representerer alle typer elementer.
Q # 4) Hva er Type Erasure i Java?
Svar: En prosess utført av Java-kompilator der de parametrerte typene som brukes i generikk fjernes og tilordnes til råtyper i byte-kode. Som sådan inneholder bytekoden ingen informasjon om generiske stoffer.
Q # 5) Hva er en rå type i Java?
Svar: Råtyper er generiske typer uten å bruke typeparameteren. F.eks. Liste er en rå type; mens List er en parameterisert type.
Konklusjon
I Java kan ikke den generiske matrisen defineres direkte, dvs. at du ikke kan ha en parameterisert type tilordnet en matrisereferanse. Ved å bruke objektmatriser og refleksjonsfunksjoner kan du imidlertid simulere generisk generering av matriser.
Vi har sett disse to tilnærmingene i denne opplæringen sammen med detaljene i generisk arrayopprettingsfeil og mulighetene for å forhindre en slik feil. I et nøtteskall, i Java, kan du si matriser og generiske stoffer ikke går hånd i hånd, ettersom matriser er kovariante mens generiske er uforanderlige.
=> Ta en titt på den perfekte Java-treningsveiledningen her.
Anbefalt lesing
- Java Array - Hvordan skrive ut elementer av en array i Java?
- Java Array Length Tutorial With Code Eksempler
- Java Reflection Tutorial med eksempler
- Java Array - Erklære, opprette og initialisere en array i Java
- Introduksjon til Java Arrays og relaterte konsepter
- Java Generics Tutorial med eksempler
- Java SWING Tutorial: Container, Components and Event Handling
- Java datatyper, sløyfer, matriser, bryter og påstander