java generic array how simulate generic arrays java
Denna handledning förklarar hur man simulerar funktionaliteten hos generisk matris i Java med hjälp av Object Array och även med Reflection Class med ett enkelt exempel:
Vi har redan diskuterat Java generics i en av våra tidigare självstudier. Java tillåter generiska klasser, metoder etc. som kan förklaras oberoende av typer. Men Java tillåter inte att arrayen är generisk.
Anledningen till detta är att i Java innehåller matriser information relaterad till deras komponenter och denna information används för att allokera minne vid körning. När generics används, på grund av typradering, innehåller byte-koden ingen generisk information.
=> Besök här för att lära dig Java från Scratch.
Vad du kommer att lära dig:
Generisk matris i Java
Om du har definierat en generisk matris kommer inte komponenttypen att vara känd vid körning. Det är därför inte tillrådligt att definiera matriser som generiska i Java.
En definition av generisk matris är som visas nedan:
E [] newArray = new E[length];
Kompilatorn känner inte till den exakta typen som ska installeras eftersom typinformationen inte är tillgänglig vid körning.
Så istället för matriser, när generics krävs, bör du föredra listkomponenten i Java Collections-ramverket. Du kan dock skapa generiska strukturer som är arrayliknande med hjälp av objektmatris och reflektionsfunktion i Java.
Dessa två tillvägagångssätt som gör det möjligt för oss att definiera matriser av olika datatyper förklaras nedan i detalj.
hur man använder thread.sleep i java
Skapa och initialisera den generiska matrisen
I det här avsnittet ska vi skapa en arrayliknande struktur som är generisk. Med dessa strukturer kommer du att kunna skapa matriser genom att ange datatypen som ett argument.
Använda Object Array
Detta tillvägagångssätt använder matrisen av typen Objekt som medlem i huvudmatrisklassen. Vi använder också get / set-metoder för att läsa och ställa in arrayelementen. Sedan instanserar vi huvudmatrisklassen som tillåter oss att tillhandahålla datatypen efter behov.
Detta simulerar den generiska matrisen.
Följande program visar användningen av objektmatrisen för att skapa en generisk arrayliknande 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 ovanstående program har vi definierat en klassmatris som är generisk. Objektmatrisen är en medlem i klassen som instanseras med hjälp av en konstruktör och längd. Vi använder också de generiska get and set-metoderna som används för att läsa och ställa in ett arrayelement av en viss typ.
Sedan skapar vi instanser av denna matrisklass. När vi skapar instanser kan vi ange önskad typ. I ovanstående program har vi skapat två arrayer av typen Integer och String och sedan fyller vi dessa arrays med lämpliga värden (med inställningsmetoden).
Slutligen använder vi den åsidosatta 'toString'-metoden vi visar innehållet i var och en av dessa instanser.
Använda reflektion
I det här tillvägagångssättet använder vi en reflektionsklass för att skapa en generisk matris vars typ kommer att vara känd endast vid körning.
Tillvägagångssättet liknar det föregående med bara en skillnad, det vill säga vi använder reflektionsklassen i konstruktören själv för att instantiera en objektmatris genom att uttryckligen överföra datatypsinformation till klasskonstruktören.
Denna typ av information överförs till Array.newInstance-reflektionsmetoden.
Följande program visar användningen av reflektion för att skapa en generisk matris . Observera att hela programstrukturen liknar den tidigare metoden med bara skillnaden i användning av reflektionsfunktioner.
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:
Ovanstående program visar matriser av två typer, dvs. heltal och sträng skapad från generisk klass Arrays.
Generic Array Creation Error
Vi har redan diskuterat konsekvenserna av att skapa generiska matriser i Java och varför det inte är möjligt att ha generiska matriser i Java. En annan förklaring till detta är att matriser i Java är kovarianta medan generiska inte är det. Generika är oföränderliga.
Med kovarians menar vi att en array av subtypen kan tilldelas dess supertypreferens.
Detta betyder att följande uttalande fungerar bra.
stadier av livscykeln för programvaruutveckling
Number numArray[] = new Integer[10];
Eftersom heltal är en undertyp av nummer, sammanställs ovanstående uttalande bra.
Men om vi använder samma koncept med generics fungerar det inte, dvs med generics, vi kan inte tilldela subtyp generic till en supertyp generic.
Uttalandet ListobjList = new ArrayList (); kommer att ge ett kompileringsfel eftersom generika inte är kovarianta som arrays.
Med tanke på ovanstående skäl kan vi inte ha något som nedan också:
public static ArrayList[] myarray = new ArrayList[2];
Detta uttalande kommer inte att kompileras med felet, “Generisk matrisskapande” eftersom vi inte kan förklara en rad referenser till en specifik generisk typ.
Vi kan dock skapa en rad referenser till en specifik generisk typ med jokertecken. Ovanstående uttalande kan sammanställas framgångsrikt med en liten förändring av att använda ett jokertecken som visas nedan.
public static ArrayListmyarray = new ArrayList[5];
Ovanstående uttalande kommer att sammanställas framgångsrikt.
Följande program visar en demonstration av att använda jokertecken.
hur man öppnar en .bin
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 ovanstående program har vi det första uttalandet i huvudmetoden som indikerar invariansen hos generika. Detta uttalande kommer att blinka kompileringsfelet (visas i kommentarer). Nästa matris skapas enligt reglerna för generiska och därmed kompilerar de framgångsrikt.
Vanliga frågor
F # 1) Vad är en generisk matris?
Svar: Arrayer som är oberoende av datatypen och vars typ av information utvärderas vid körning är generiska arrays. Generics liknar mallar i C ++.
F # 2) Kan du skapa en generisk matris i Java?
Svar: Arrayer är kovarianta i Java, dvs vilken underklassmatris som helst kan tilldelas en supertypmatris. Generics är emellertid invarianta, dvs. du kan inte tilldela underklass typ array till superklass typ.
För det andra tas generisk information bort från JVM och därmed vet inte arrayen vars minnesallokering görs vid körning vilken typ som ska tilldelas arrayen. Således går matriser och generika inte bra tillsammans i Java.
F # 3) Vad är typ E i Java?
Svar: fungerar som en platshållare för generika och representerar alla typer av element.
F # 4) Vad är typradering i Java?
Svar: En process utförd av Java-kompilator genom vilken de parametrerade typerna som används i generics tas bort och mappas till råtyper i byte-kod. Som sådan innehåller byte-koden ingen information om generiska ämnen.
F # 5) Vad är en rå typ i Java?
Svar: Råtyper är generiska typer utan att använda typparametern. T.ex. Listan är en rå typ; medan List är en parametrerad typ.
Slutsats
I Java kan den generiska matrisen inte definieras direkt, dvs. du kan inte ha en parametrerad typ tilldelad en matrisreferens. Med hjälp av objektmatriser och reflektionsfunktioner kan du simulera skapandet av generiska matriser.
Vi har sett dessa två tillvägagångssätt i den här självstudien tillsammans med detaljerna i generisk array-skapande fel och möjligheterna att förhindra sådana fel. I ett nötskal, i Java kan du säga att matriser och generika inte går hand i hand eftersom matriser är kovarianta medan generiska är invarianta.
=> Kolla in den perfekta Java-träningsguiden här.
Rekommenderad läsning
- Java Array - Hur man skriver ut delar av en array i Java?
- Java Array Length Tutorial With Code Exempel
- Java Reflection Tutorial med exempel
- Java Array - Förklara, skapa och initialisera en array i Java
- Introduktion till Java Arrays och relaterade begrepp
- Java Generics-handledning med exempel
- Java SWING-handledning: Container, komponenter och händelsehantering
- Java datatyper, slingor, matriser, switch och påståenden