java generic array how simulate generic arrays java
W tym samouczku wyjaśniono, jak symulować funkcjonalność tablicy ogólnej w języku Java przy użyciu tablicy obiektów, a także przy użyciu klasy odbicia z prostym przykładem:
Już omówiliśmy Java generics w jednym z naszych poprzednich tutoriali. Java dopuszcza ogólne klasy, metody itp., Które można zadeklarować niezależnie od typów. Jednak Java nie pozwala na to, aby tablica była ogólna.
Powodem tego jest to, że w Javie tablice zawierają informacje związane z ich komponentami i te informacje są wykorzystywane do przydzielania pamięci w czasie wykonywania. Gdy używane są typy ogólne, ze względu na wymazywanie typów kod bajtowy nie zawiera żadnych informacji ogólnych.
=> Odwiedź tutaj, aby nauczyć się języka Java od podstaw.
Czego się nauczysz:
Ogólna tablica w Javie
Jeśli zdefiniowałeś tablicę ogólną, typ komponentu nie będzie znany w czasie wykonywania. Dlatego nie zaleca się definiowania tablic jako ogólnych w Javie.
Definicja Generic Array jest pokazana poniżej:
E () newArray = new E(length);
Kompilator nie zna dokładnego typu, który ma zostać utworzony, ponieważ informacje o typie nie są dostępne w czasie wykonywania.
Dlatego zamiast tablic, gdy wymagane są typy ogólne, należy preferować składnik listy struktury kolekcji Java. Można jednak tworzyć ogólne struktury, które są podobne do tablic przy użyciu tablicy obiektów i funkcji odbicia języka Java.
Te dwa podejścia, które pozwalają nam definiować tablice różnych typów danych, zostały szczegółowo wyjaśnione poniżej.
generator liczb losowych od 0 do 1
Utwórz i zainicjuj tablicę ogólną
W tej sekcji stwórzmy strukturę przypominającą tablicę, która ma charakter ogólny. Korzystając z tych struktur, będziesz mógł tworzyć tablice, podając typ danych jako argument.
Korzystanie z tablicy obiektów
W tym podejściu tablica typu Objects jest używana jako element członkowski głównej klasy tablicy. Używamy również metod get / set do odczytywania i ustawiania elementów tablicy. Następnie tworzymy instancję głównej klasy tablicowej, która pozwala nam podać wymagany typ danych.
To symuluje ogólną tablicę.
Poniższy program demonstruje użycie tablicy obiektów do utworzenia struktury przypominającej tablicę ogólną.
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 Wynik:
W powyższym programie zdefiniowaliśmy klasę Array, która jest generyczna. Tablica obiektów jest członkiem klasy, której wystąpienie jest tworzone przy użyciu konstruktora i długości. Używamy również ogólnych metod get and set, które są używane do odczytywania i ustawiania elementu tablicy określonego typu.
Następnie tworzymy instancje tej klasy tablicy. Podczas tworzenia instancji możemy określić żądany typ. W powyższym programie stworzyliśmy dwie tablice typu Integer i String, a następnie zapełniamy te tablice odpowiednimi wartościami (metodą set).
Wreszcie, używając nadpisanej metody „toString”, wyświetlamy zawartość każdego z tych wystąpień.
Korzystanie z odbicia
W tym podejściu używamy klasy odbicia do tworzenia ogólnej tablicy, której typ będzie znany tylko w czasie wykonywania.
Podejście jest podobne do poprzedniego z tylko jedną różnicą, tj. Używamy klasy odbicia w samym konstruktorze do utworzenia wystąpienia tablicy obiektów przez jawne przekazanie informacji o typie danych do konstruktora klasy.
Ten typ informacji jest przekazywany do metody odbicia Array.newInstance.
Poniższy program pokazuje użycie odbicia do utworzenia ogólnej tablicy . Zwróć uwagę, że cała struktura programu jest podobna do poprzedniego podejścia, z tą różnicą, że używa się funkcji odbicia.
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 Wynik:
Powyższy program pokazuje tablice dwóch typów tj. Integer i String utworzone z klasy generycznej Arrays.
Błąd tworzenia tablicy ogólnej
Omówiliśmy już konsekwencje tworzenia tablic generycznych w Javie i dlaczego nie jest możliwe posiadanie tablic ogólnych w Javie. Innym wyjaśnieniem jest to, że tablice w Javie są kowariantne, podczas gdy generyczne nie. Typy generyczne są niezmienne.
Przez kowariancję rozumiemy, że tablica podtypu może być przypisana do jego odwołania do nadtypu.
Oznacza to, że poniższe stwierdzenie będzie działać dobrze.
Number numArray() = new Integer(10);
Ponieważ Integer jest podtypem Number, powyższa instrukcja kompiluje się dobrze.
Ale jeśli użyjemy tego samego pojęcia z rodzajami rodzajowymi, to nie zadziała, tj. Z rodzajami rodzajowymi nie możemy przypisać podtypu rodzajowego do nadtypu rodzajowego.
narzędzia wykorzystywane w analizie dużych zbiorów danych
Instrukcja ListobjList = new ArrayList (); zwróci błąd kompilacji, ponieważ typy generyczne nie są kowariantne jak tablice.
Mając na uwadze powyższy powód, nie możemy mieć też czegoś takiego jak poniżej:
public static ArrayList() myarray = new ArrayList(2);
Ta instrukcja nie skompiluje się z błędem, „Ogólne tworzenie tablic” ponieważ nie możemy zadeklarować tablicy odwołań do określonego typu ogólnego.
Możemy jednak utworzyć tablicę odniesień do określonego typu ogólnego za pomocą symboli wieloznacznych. Powyższe oświadczenie można pomyślnie skompilować z niewielką zmianą użycia symbolu wieloznacznego, jak pokazano poniżej.
public static ArrayListmyarray = new ArrayList(5);
Powyższa instrukcja zostanie pomyślnie skompilowana.
Poniższy program przedstawia demonstrację użycia symboli wieloznacznych.
przekonwertuj liczbę znaków na int c ++
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)); } }
Wynik:
W powyższym programie mamy pierwszą instrukcję w metodzie głównej, która wskazuje na niezmienność typów ogólnych. Ta instrukcja wyświetli błąd kompilacji (pokazany w komentarzach). Kolejne tworzenie tablic odbywa się zgodnie z regułami typów ogólnych, dzięki czemu kompilują się pomyślnie.
Często Zadawane Pytania
Pytanie 1) Co to jest tablica ogólna?
Odpowiedź: Tablice, które są niezależne od typu danych i których typ informacji jest oceniany w czasie wykonywania, to tablice ogólne. Typy generyczne są podobne do szablonów w C ++.
Pytanie 2) Czy możesz utworzyć ogólną tablicę w Javie?
Odpowiedź: Tablice są kowariantne w Javie, tzn. Każda tablica podklasy może być przypisana do tablicy nadtypu. Typy generyczne są jednak niezmienne, tj. Nie można przypisać tablicy typu podklasy do typu nadklasy.
Po drugie, informacje ogólne są usuwane z JVM, a zatem tablica, której alokacja pamięci jest wykonywana w czasie wykonywania, nie wie, jaki typ ma zostać przypisany do tablicy. Dlatego tablice i typy generyczne nie pasują do siebie w Javie.
Pytanie 3) Co to jest typ E w Javie?
Odpowiedź: pełni rolę symbolu zastępczego dla typów ogólnych i reprezentuje dowolny typ elementu.
Pytanie 4) Co to jest wymazywanie typów w Javie?
Odpowiedź: Proces wykonywany przez kompilator języka Java, za pomocą którego sparametryzowane typy używane w rodzajach są usuwane i mapowane na typy surowe w kodzie bajtowym. W związku z tym kod bajtowy nie zawiera żadnych informacji o typach ogólnych.
P # 5) Co to jest typ surowy w Javie?
Odpowiedź: Typy surowe są typami ogólnymi bez użycia parametru type. Na przykład. Lista jest typem surowym; podczas gdy List jest typem sparametryzowanym.
Wniosek
W Javie ogólnej tablicy nie można zdefiniować bezpośrednio, tj. Nie można przypisać sparametryzowanego typu do odwołania do tablicy. Jednak korzystając z tablic obiektów i funkcji odbicia, można symulować tworzenie szyku ogólnego.
W tym samouczku widzieliśmy te dwa podejścia wraz ze szczegółami ogólnego błędu tworzenia tablicy i możliwościami uniknięcia takiego błędu. W skrócie, w Javie można powiedzieć, że tablice i typy generyczne nie idą w parze, ponieważ tablice są kowariantne, a typy ogólne są niezmienne.
=> Sprawdź idealny przewodnik szkoleniowy języka Java tutaj.
rekomendowane lektury
- Tablica Java - jak wydrukować elementy tablicy w języku Java?
- Samouczek dotyczący długości tablicy w języku Java z przykładami kodu
- Samouczek dotyczący refleksji w języku Java z przykładami
- Java Array - Deklaruj, twórz i inicjuj tablicę w Javie
- Wprowadzenie do tablic Java i powiązanych pojęć
- Samouczek Java Generics z przykładami
- Samouczek Java SWING: kontener, komponenty i obsługa zdarzeń
- Java DataTypes, pętle, tablice, przełącznik i asercje