java generic array how simulate generic arrays java
Aquest tutorial explica com simular la funcionalitat de matriu genèrica a Java mitjançant matriu d'objectes i també amb classe de reflexió amb un exemple senzill:
Ja ho hem comentat Genèrics Java en un dels nostres tutorials anteriors. Java permet classes genèriques, mètodes, etc. que es poden declarar independents dels tipus. Tot i això, Java no permet que la matriu sigui genèrica.
La raó d'això és que a Java, les matrius contenen informació relacionada amb els seus components i aquesta informació s'utilitza per assignar memòria en temps d'execució. Quan s’utilitzen genèrics, a causa de l’esborrat de tipus, el codi de bytes no conté cap informació genèrica.
=> Visiteu aquí per aprendre Java des de zero.
Què aprendreu:
Matriu genèrica a Java
Si heu definit una matriu genèrica, el tipus de component no es coneixerà en temps d'execució. Per tant, no és recomanable definir matrius com a genèrics a Java.
Una definició de matriu genèrica és la següent:
E () newArray = new E(length);
El compilador no sap el tipus exacte que s’ha d’instanciar, ja que la informació del tipus no està disponible en temps d’execució.
Per tant, en lloc de matrius, sempre que es requereixin genèrics, hauríeu de preferir el component de llista del framework Java Collections. Tanmateix, podeu crear estructures genèriques que siguin semblants a les matrius mitjançant la matriu d'objectes i la funció de reflexió de Java.
Aquests dos enfocaments que ens permeten definir matrius de diferents tipus de dades s’expliquen a continuació amb detall.
quin és el millor netejador de PC gratuït
Creeu i inicialitzeu la matriu genèrica
En aquesta secció, creem una estructura de tipus matriu que té un caràcter genèric. Utilitzant aquestes estructures, podreu crear matrius proporcionant el tipus de dades com a argument.
Ús d'objectes
Aquest enfocament utilitza la matriu d'objectes de tipus com a membre de la classe de matriu principal. També fem servir mètodes get / set per llegir i configurar els elements de la matriu. A continuació, instanciem la classe de matriu principal que ens permet proporcionar el tipus de dades segons sigui necessari.
Això simula la matriu genèrica.
El programa següent mostra l'ús de la matriu d'objectes per crear una estructura genèrica de tipus matriu.
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 Sortida:

Al programa anterior, hem definit una classe Array que és genèrica. La matriu d'objectes és un membre de la classe que s'instancia amb un constructor i una longitud. També fem servir els mètodes genèrics get and set que s’utilitzen per llegir i configurar un element de matriu d’un tipus concret.
A continuació, creem instàncies d'aquesta classe de matriu. En crear instàncies, podem especificar el tipus desitjat. Al programa anterior, hem creat dues matrius de tipus Integer i String i, a continuació, omplim aquestes matrius amb els valors adequats (mitjançant el mètode set).
programari gratuït d’extracció de DVD per a macs
Finalment, utilitzant el mètode 'toString' sobreescrit, mostrem el contingut de cadascuna d'aquestes instàncies.
Utilitzant Reflection
En aquest enfocament, fem servir una classe de reflexió per crear una matriu genèrica el tipus del qual només es coneixerà en temps d'execució.
L’enfocament és similar a l’anterior amb només una diferència, és a dir, utilitzem la classe de reflexió en el propi constructor per instanciar una matriu d’objectes passant explícitament la informació del tipus de dades al constructor de classes.
Aquest tipus d'informació es passa al mètode de reflexió Array.newInstance.
El programa següent mostra l'ús de la reflexió per crear una matriu genèrica . Tingueu en compte que tota l'estructura del programa és similar a l'enfocament anterior, només amb la diferència en l'ús de les funcions de reflexió.
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 Sortida:

El programa anterior mostra matrius de dos tipus, és a dir, Integer i String creats a partir de la classe genèrica Arrays.
Error de creació de matriu genèrica
Ja hem comentat les implicacions de crear matrius genèrics a Java i per què no és possible tenir matrius genèrics a Java. Una altra explicació a això és que les matrius a Java són covariants mentre que els genèrics no. Els genèrics són invariants.
Per covariància, volem dir que es pot assignar una matriu del subtipus a la seva referència de supertipus.
Això significa que la següent afirmació funcionarà bé.
Number numArray() = new Integer(10);
Com que Enter és un subtipus de Number, la sentència anterior es compila bé.
Però si fem servir el mateix concepte amb els genèrics, no funcionarà, és a dir, amb els genèrics, no podem assignar genèrics de subtipus a genèrics de supertipus.
La declaració, ListobjList = new ArrayList (); donarà un error de compilació ja que els genèrics no són covariants com a matrius.
Tenint present la raó anterior, no podem tenir cap cosa semblant a la següent:
public static ArrayList() myarray = new ArrayList(2);
Aquesta declaració no es compilarà amb l'error, 'Creació de matriu genèrica' ja que no podem declarar un conjunt de referències a un tipus genèric específic.
No obstant això, podem crear una sèrie de referències a un tipus genèric específic mitjançant comodins. La sentència anterior es pot compilar amb èxit amb un lleuger canvi en utilitzar un comodí com es mostra a continuació.
public static ArrayListmyarray = new ArrayList(5);
La sentència anterior es compilarà correctament.
El programa següent mostra una demostració de l’ús de comodins.
programari gratuït d’extracció de DVD per a macs
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)); } }
Sortida:

Al programa anterior, tenim la primera afirmació del mètode principal que indica la invariancia dels genèrics. Aquesta afirmació mostrarà l'error de compilació (que es mostra als comentaris). La següent creació de matriu és segons les regles dels genèrics i, per tant, es compilen amb èxit.
Preguntes freqüents
P # 1) Què és un array genèric?
Resposta: Les matrius que són independents del tipus de dades i el tipus d'informació de les quals s'avalua en temps d'execució són matrius genèriques. Els genèrics són similars a les plantilles de C ++.
Q # 2) Podeu crear una matriu genèrica a Java?
Resposta: Les matrius són covariants a Java, és a dir, que qualsevol matriu de subclase es pot assignar a una matriu de supertipus. No obstant això, els genèrics són invariants, és a dir, no es pot assignar matriu de tipus de subclasse al tipus de superclasse.
En segon lloc, la informació genèrica s’elimina de JVM i, per tant, la matriu l’assignació de la memòria es realitza en temps d’execució no sap quin tipus s’ha d’assignar a la matriu. Per tant, les matrius i els genèrics no van bé junts a Java.
P # 3) Què és el tipus E a Java?
Resposta: actua com a marcador de posició dels genèrics i representa qualsevol tipus d'element.
Q # 4) Què és Type Erasure a Java?
Resposta: Un procés realitzat pel compilador Java mitjançant el qual els tipus parametritzats utilitzats en els genèrics s’eliminen i s’assignen als tipus en brut en codi de bytes. Com a tal, el codi de bytes no conté cap informació sobre els genèrics.
P # 5) Què és un tipus Raw a Java?
Resposta: Els tipus en brut són tipus genèrics sense utilitzar el paràmetre type. Per exemple. La llista és un tipus cru; mentre que Llista és un tipus parametritzat.
Conclusió
A Java, la matriu genèrica no es pot definir directament, és a dir, no es pot assignar un tipus de paràmetre a una referència de matriu. No obstant això, mitjançant matrius d'objectes i funcions de reflexió, podeu simular la creació de matriu genèrica.
Hem vist aquests dos enfocaments en aquest tutorial juntament amb els detalls de l’error de creació de matriu genèrica i les possibilitats d’evitar aquest error. En poques paraules, a Java, es pot dir que les matrius i els genèrics no van de la mà, ja que les matrius són covariants mentre que els genèrics són invariants.
=> Consulteu la guia de formació Java perfecta aquí.
Lectura recomanada
- Java Array - Com imprimir elements d'un array a Java?
- Tutorial de longitud de matriu de Java amb exemples de codi
- Tutorial de reflexió de Java amb exemples
- Matriu Java: declarar, crear i inicialitzar una matriu a Java
- Introducció a matrius de Java i conceptes relacionats
- Tutorial de Java Generics amb exemples
- Tutorial Java SWING: Gestió de contenidors, components i esdeveniments
- Tipus de dades, bucles, matrius, commutadors i assercions de Java