java generic array how simulate generic arrays java
Този урок обяснява как да се симулира функционалността на генеричния масив в Java с помощта на Object Array и също така с помощта на клас на отражение с прост пример:
Вече обсъдихме Java дженерици в един от предишните ни уроци. Java позволява общи класове, методи и т.н., които могат да бъдат обявени независимо от типовете. Java обаче не позволява масивът да е общ.
Причината за това е, че в Java масивите съдържат информация, свързана с техните компоненти и тази информация се използва за разпределяне на памет по време на изпълнение. Когато се използват генерични лекарства, поради изтриване на типа, байтовият код не съдържа никаква информация за генерични продукти.
=> Посетете тук, за да научите Java от нулата.
Какво ще научите:
Общ масив в Java
Ако сте дефинирали общ масив, тогава типът на компонента няма да бъде известен по време на изпълнение. Поради това не е препоръчително да се определят масиви като общи в Java.
Дефиницията на общ масив е както е показано по-долу:
E () newArray = new E(length);
Компилаторът не знае точния тип, който трябва да бъде създаден, тъй като информацията за типа не е налична по време на изпълнение.
Така че вместо масиви, когато се изискват генерични продукти, трябва да предпочитате списъчния компонент на рамката на Java Collections. Можете обаче да създавате общи структури, които са подобни на масив, като използвате обектния масив и отразяващата функция на Java.
Тези два подхода, които ни позволяват да дефинираме масиви от различни типове данни, са обяснени подробно по-долу.
уеб услуги c # въпроси за интервю
Създайте и инициализирайте общия масив
В този раздел нека създадем подобна на масив структура, която е с общ характер. Използвайки тези структури, ще можете да създавате масиви, като предоставите типа данни като аргумент.
Използване на Object Array
Този подход използва масива от тип Обекти като член на основния клас масив. Също така използваме методите get / set, за да четем и задаваме елементите на масива. След това създаваме инстанция на основния клас масив, който ни позволява да предоставим типа на данните според изискванията.
Това симулира общия масив.
Следващата програма демонстрира използването на масив от обекти за създаване на обща структура, подобна на масив.
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 Изход:

В горната програма дефинирахме клас Array, който е общ. Обектният масив е член на класа, който е създаден с помощта на конструктор и дължина. Също така използваме общите методи get и set, които се използват за четене и задаване на елемент от масив от определен тип.
най-добрият софтуер за наблюдение на температурата на процесора
След това създаваме екземпляри от този клас масив. Докато създаваме екземпляри, можем да посочим желания тип. В горната програма създадохме два масива от тип Integer и String и след това попълваме тези масиви с подходящи стойности (използвайки метода set).
Накрая, използвайки заменения метод ‘toString’, ние показваме съдържанието на всеки от тези случаи.
Използване на Отражение
При този подход използваме клас на отражение, за да създадем общ масив, чийто тип ще бъде известен само по време на изпълнение.
Подходът е подобен на предишния само с една разлика, т.е.използваме клас на отражение в самия конструктор, за да създадем екземпляр на масив от обекти чрез изрично предаване на информацията за типа данни на конструктора на класа.
Този тип информация се предава на метода на отражение Array.newInstance.
Следващата програма показва използването на отражение за създаване на общ масив . Обърнете внимание, че цялата програмна структура е подобна на предишния подход само с разликата в използването на функциите за отражение.
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 Изход:

Горната програма показва масиви от два типа, т.е.Integer и String, създадени от общия клас Arrays.
Обща грешка при създаване на масив
Вече обсъдихме последиците от създаването на родови масиви в Java и защо не е възможно да имаме родови масиви в Java. Друго обяснение на това е, че масивите в Java са ковариантни, докато генеричните не са. Дженериците са инвариантни.
Под ковариация имаме предвид, че масив от подтипа може да бъде присвоен на неговата препратка към супертип.
Това означава, че следното изявление ще работи добре.
Number numArray() = new Integer(10);
Тъй като Integer е подтип на Number, горното изявление се компилира добре.
Но ако използваме една и съща концепция с генерици, тя няма да работи, т.е.с генерици, не можем да присвоим подтип родов на супертип родов.
Изявлението, ListobjList = new ArrayList (); ще даде грешка при компилацията, тъй като генеричните лекарства не са ковариантни като масиви.
Имайки предвид горната причина, не можем да имаме и нещо като по-долу:
public static ArrayList() myarray = new ArrayList(2);
Това изявление няма да успее да се компилира с грешката, „Създаване на общ масив“ тъй като не можем да декларираме масив от препратки към определен родов тип.
Можем обаче да създадем масив от препратки към конкретен родов тип, като използваме заместващи символи. Горното изявление може да бъде компилирано успешно с малка промяна в използването на заместващ знак, както е показано по-долу.
public static ArrayListmyarray = new ArrayList(5);
Горното изявление ще се компилира успешно.
Следващата програма показва демонстрация на използване на заместващи символи.
инструменти за тестване на уеб услуги с отворен код
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)); } }
Изход:

В горната програма имаме първото твърдение в основния метод, което показва неизменността на генеричните лекарства. Това изявление ще мига при грешката при компилацията (показана в коментари). Следващото създаване на масив е според правилата на генеричните продукти и по този начин те се компилират успешно.
често задавани въпроси
В # 1) Какво е общ масив?
Отговор: Масивите, които са независими от типа на данните и чийто тип информация се оценява по време на изпълнение, са генерични масиви. Дженериците са подобни на шаблоните в C ++.
В # 2) Можете ли да създадете общ масив в Java?
Отговор: Масивите са ковариантни в Java, т.е.масив от подклас може да бъде присвоен на масив от супертип. Дженериците обаче са инвариантни, т.е.не можете да присвоите масив от тип подклас на тип суперклас.
На второ място, общата информация се премахва от JVM и по този начин масивът, чието разпределение на паметта се извършва по време на изпълнение, не знае кой тип трябва да бъде присвоен на масива. По този начин масивите и генеричните продукти не се съчетават добре в Java.
В # 3) Какво представлява Тип Е в Java?
Отговор: действа като заместител за генерични продукти и представлява всеки тип елемент.
В # 4) Какво представлява изтриването на типа в Java?
Отговор: Процес, осъществен от Java компилатор, чрез който параметризираните типове, използвани в генеричните продукти, се премахват и преобразуват в сурови типове в байт код. Като такъв, байт кодът не съдържа никаква информация за генеричните лекарства.
В # 5) Какво представлява суров тип в Java?
Отговор: Суровите типове са родови типове, без да се използва параметърът type. E.g. Списъкът е суров тип; като има предвид, че Списъкът е параметризиран тип.
Заключение
В Java родовият масив не може да бъде дефиниран директно, т.е.не можете да имате параметризиран тип, присвоен на референция на масив. Въпреки това, използвайки обектни масиви и функции за отразяване, можете да симулирате създаването на общ масив.
Видяхме тези два подхода в този урок, заедно с подробностите за общата грешка при създаване на масив и възможностите за предотвратяване на такава грешка. С две думи, в Java можете да кажете, че масивите и генеричните лекарства не вървят ръка за ръка, тъй като масивите са ковариантни, докато генеричните са инвариантни.
=> Вижте Перфектното ръководство за обучение по Java тук.
Препоръчително четене
- Java Array - Как да отпечатвате елементи от масив в Java?
- Урок за дължина на масив Java с примери за кодове
- Урок за отражение на Java с примери
- Java Array - Декларирайте, създайте и инициализирайте масив в Java
- Въведение в Java масивите и свързаните с тях концепции
- Урок за Java Generics с примери
- Java SWING Урок: Контейнер, компоненти и обработка на събития
- Java DataTypes, Loops, Arrays, Switch и Assertions