java generic array how simulate generic arrays java
Tento výukový program vysvětluje, jak simulovat funkčnost obecného pole v Javě pomocí Object Array a také pomocí Reflection Class s jednoduchým příkladem:
Už jsme diskutovali Generika Java v jednom z našich předchozích tutoriálů. Java umožňuje generické třídy, metody atd., Které lze deklarovat nezávisle na typech. Java však neumožňuje, aby pole bylo obecné.
Důvodem je to, že v Javě obsahují pole informace týkající se jejich komponent a tyto informace se používají k přidělení paměti za běhu. Pokud se použijí generika, z důvodu vymazání typu neobsahuje bajtový kód žádné obecné informace.
=> Navštivte zde a dozvíte se Java od začátku.
Co se naučíte:
Generické pole v Javě
Pokud jste definovali obecné pole, nebude typ komponenty za běhu znám. Proto není vhodné v Javě definovat pole jako obecná.
Definice obecného pole je uvedena níže:
E () newArray = new E(length);
Kompilátor nezná přesný typ, který má být vytvořen, protože informace o typu nejsou za běhu k dispozici.
Takže namísto polí, kdykoli jsou požadovány obecné informace, byste měli upřednostňovat komponentu seznamu rámce Java Collections. Můžete však vytvořit obecné struktury, které se podobají maticím, pomocí matice objektů a funkce odrazu v Javě.
Tyto dva přístupy, které nám umožňují definovat pole různých datových typů, jsou podrobně vysvětleny níže.
top 10 webů ke sledování anime
Vytvořte a inicializujte generické pole
V této části vytvořme strukturu podobnou poli, která má obecnou povahu. Pomocí těchto struktur budete moci vytvořit pole zadáním datového typu jako argumentu.
Použití Object Array
Tento přístup používá pole typu Objects jako člena třídy hlavního pole. Ke čtení a nastavování prvků pole používáme také metody get / set. Poté vytvoříme instanci hlavní třídy pole, která nám umožní poskytnout datový typ podle potřeby.
To simuluje obecné pole.
Následující program ukazuje použití pole objektu k vytvoření obecné struktury podobné matici.
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 Výstup:
Ve výše uvedeném programu jsme definovali třídu Array, která je obecná. Pole objektu je členem třídy, která je vytvořena pomocí konstruktoru a délky. Používáme také obecné metody get a set, které se používají ke čtení a nastavení prvku pole konkrétního typu.
Pak vytvoříme instance této třídy pole. Při vytváření instancí můžeme určit požadovaný typ. Ve výše uvedeném programu jsme vytvořili dvě pole typu Integer a String a poté tato pole naplníme příslušnými hodnotami (pomocí metody set).
Nakonec pomocí přepsané metody ‚toString 'zobrazíme obsah každé z těchto instancí.
Použití reflexe
V tomto přístupu použijeme třídu reflexe k vytvoření obecného pole, jehož typ bude znám pouze za běhu.
Přístup je podobný předchozímu s jediným rozdílem, tj. Používáme třídu odrazu v samotném konstruktoru k vytvoření instance pole objektu explicitním předáním informací o datovém typu konstruktoru třídy.
Tento typ informací je předán metodě reflexe Array.newInstance.
jak nainstalovat svn plugin v zatmění
Následující program ukazuje použití odrazu k vytvoření obecného pole . Všimněte si, že celá struktura programu je podobná předchozímu přístupu, jen s rozdílem v použití funkcí odrazu.
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 Výstup:
Výše uvedený program ukazuje pole dvou typů, tj. Integer a String vytvořené z generické třídy Arrays.
Obecná chyba při vytváření pole
Už jsme diskutovali o důsledcích vytváření obecných polí v Javě a proč není možné mít obecná pole v Javě. Dalším vysvětlením je, že pole v Javě jsou kovariantní, zatímco obecná nikoli. Generika jsou neměnná.
Kovariancí máme na mysli, že poli podtypu lze přiřadit jeho referenci supertypu.
To znamená, že následující prohlášení bude fungovat dobře.
Number numArray() = new Integer(10);
Jelikož je celé číslo podtypem Number, výše uvedený příkaz je v pořádku.
Pokud ale použijeme stejný koncept s generikami, nebude to fungovat, tj. S generikami, nemůžeme přiřadit generický podtyp generickému supertypu.
Příkaz ListobjList = new ArrayList (); dá chybu kompilace, protože generika nejsou kovariantní jako pole.
S ohledem na výše uvedený důvod nemůžeme mít ani něco podobného:
public static ArrayList() myarray = new ArrayList(2);
Toto prohlášení se nepodaří zkompilovat s chybou, „Generic array creation“ protože nemůžeme deklarovat řadu odkazů na konkrétní obecný typ.
Můžeme však vytvořit řadu odkazů na konkrétní obecný typ pomocí zástupného znaku. Výše uvedený příkaz lze úspěšně zkompilovat s malou změnou použití zástupného znaku, jak je znázorněno níže.
public static ArrayListmyarray = new ArrayList(5);
Výše uvedený příkaz bude úspěšně zkompilován.
Následující program ukazuje demonstraci použití zástupných znaků.
role obchodního analytika v agilním skrumáži
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)); } }
Výstup:
Ve výše uvedeném programu máme první příkaz v hlavní metodě, který označuje invariance generik. V tomto prohlášení bude blikat chyba kompilace (zobrazená v komentářích). Další vytvoření pole je podle pravidel generik a proto se úspěšně kompilují.
Často kladené otázky
Otázka č. 1) Co je to obecné pole?
Odpovědět: Pole, která jsou nezávislá na datovém typu a jejichž typ informací se vyhodnocuje za běhu, jsou obecná pole. Obecná jsou podobná šablonám v C ++.
Otázka č. 2) Můžete vytvořit generické pole v Javě?
Odpovědět: Pole jsou v Javě kovariantní, tzn. Každému poli podtřídy lze přiřadit pole supertypu. Obecná jsou však neměnná, tj. Nemůžete přiřadit pole typu podtřídy typu nadtřídy.
Za druhé, obecné informace jsou odstraněny z JVM, a proto pole, jehož alokace paměti se provádí za běhu, neví, který typ má být poli přiřazen. Pole a generika tedy v Javě nejdou dohromady.
Otázka č. 3) Co je typ E v Javě?
Odpovědět: funguje jako zástupný symbol pro generika a představuje jakýkoli typ prvku.
Otázka č. 4) Co je vymazání typu v Javě?
Odpovědět: Proces prováděný kompilátorem Java, pomocí kterého jsou odstraněny a parametrizovány typy používané v generikách a mapovány na nezpracované typy v bajtovém kódu. Bajtový kód jako takový neobsahuje žádné informace o generikách.
Otázka č. 5) Co je to surový typ v Javě?
Odpovědět: Nezpracované typy jsou obecné typy bez použití parametru typu. Např. Seznam je hrubý typ; zatímco List je parametrizovaný typ.
Závěr
V Javě nelze obecné pole definovat přímo, tzn. Nemůžete mít přiřazený parametrizovaný typ odkazu na pole. Pomocí polí objektů a odrazových funkcí však můžete simulovat vytváření obecného pole.
V tomto tutoriálu jsme viděli tyto dva přístupy spolu s podrobnostmi o chybě vytváření obecného pole a možnostmi takové chybě zabránit. Stručně řečeno, v Javě můžete říci, že pole a generika nejdou ruku v ruce, protože pole jsou kovariantní, zatímco generika jsou neměnná.
=> Podívejte se na průvodce Perfect Java Training Guide zde.
Doporučené čtení
- Java Array - Jak tisknout prvky pole v Javě?
- Výukový program Java Array Length s příklady kódu
- Výukový program Java Reflection s příklady
- Java Array - deklarovat, vytvořit a inicializovat pole v Javě
- Úvod do Java polí a souvisejících konceptů
- Výukový program Java Generics s příklady
- Výukový program Java SWING: Kontejner, komponenty a zpracování událostí
- Java DataTypes, Loops, Arrays, Switch a Assertions