java generic array how simulate generic arrays java
Овај водич објашњава како да се симулира функционалност генеричког низа у Јави користећи Објецт Арраи и такође помоћу класе рефлексије са једноставним примером:
Већ смо разговарали Јава генерички у једном од наших претходних водича. Јава дозвољава генеричке класе, методе итд. Које се могу прогласити неовисним од типова. Међутим, Јава не дозвољава да низ буде генерички.
Разлог томе је што у Јави низови садрже информације повезане са њиховим компонентама и те информације се користе за алокацију меморије током извођења. Када се користе генерички подаци, због брисања типа, бајт код не садржи никакве генеричке информације.
=> Посетите овде да бисте научили Јаву из нуле.
Шта ћете научити:
Генерички низ у Јави
Ако сте дефинисали генерички низ, тада тип компоненте неће бити познат током извођења. Стога није препоручљиво дефинирати низове као генеричке у Јави.
Дефиниција генеричког низа је приказана доле:
E [] newArray = new E[length];
Компајлер не зна тачан тип који треба да се примени, јер информације о типу нису доступне током извршавања.
Дакле, уместо низова, кад год су потребни генерички, требали бисте да преферирате компоненту листе оквира Јава Цоллецтионс. Међутим, можете створити генеричке структуре које су сличне низу помоћу низа објеката и одразне функције Јаве.
Ова два приступа која нам омогућавају да дефинишемо низове различитих типова података детаљно су објашњена у наставку.
бесплатни софтвер за конвертовање видео записа за Виндовс
Направите и иницијализујте генерички низ
У овом одељку створимо структуру налик низу која је генеричке природе. Користећи ове структуре, моћи ћете да креирате низове пружајући тип података као аргумент.
Коришћење низа објеката
Овај приступ користи низ објеката Објекти као члан главне класе низа. Такође користимо методе гет / сет за читање и постављање елемената низа. Затим инстанцирамо главну класу низа која нам омогућава да пружимо тип података по потреби.
Ово симулира генерички низ.
Следећи програм демонстрира употребу објектног низа за стварање генеричке структуре налик на низ.
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 Излаз:
У горе наведеном програму дефинисали смо класу Арраи која је генеричка. Низ објеката је члан класе који се инстанцира помоћу конструктора и дужине. Такође користимо генеричке методе гет и сет које се користе за читање и постављање елемента низа одређеног типа.
Затим креирамо инстанце ове класе низа. Током креирања инстанци можемо одредити жељени тип. У горе наведеном програму креирали смо два низа типа Интегер и Стринг, а затим их попуњавамо одговарајућим вредностима (помоћу методе сет).
На крају, користећи замењену методу „тоСтринг“ приказујемо садржај сваке од ових инстанци.
Коришћење Рефлецтион
У овом приступу користимо класу рефлексије за стварање генеричког низа чији ће тип бити познат само током извођења.
Приступ је сличан претходном са само једном разликом, тј. Користимо класу рефлексије у самом конструктору за инстанцирање низа објеката експлицитним прослеђивањем података о типу података конструктору класе.
питања и одговори за интервју за соапуи пдф
Ова врста информација прослеђује се методи рефлексије Арраи.невИнстанце.
Следећи програм показује употребу рефлексије за стварање генеричког низа . Имајте на уму да је целокупна програмска структура слична претходном приступу са само разликом у коришћењу рефлексионих карактеристика.
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 Излаз:
Горњи програм приказује низове два типа, тј. Интегер и Стринг створене из генеричке класе Арраис.
Грешка генеричког стварања низа
Већ смо разговарали о импликацијама стварања генеричких низова у Јави и зашто у Јави није могуће имати генеричке низове. Друго објашњење овога је да су низови у Јави коваријантни, док генерички нису. Генерички лекови су инваријантни.
Под коваријанцијом подразумевамо да се низ подтипа може доделити референци његовог супертипа.
То значи да ће следећа изјава добро функционисати.
Number numArray[] = new Integer[10];
Како је Интегер подврста броја, горња изјава се фино компајлира.
Али ако користимо исти концепт са генеричким, то неће функционисати, тј. Са генеричким, не можемо доделити генетички подтип генеричком надтипу.
Изјава, ЛистобјЛист = нев АрраиЛист (); ће дати грешку у компилацији, јер генерички лекови нису коваријантни попут низова.
Имајући у виду горњи разлог, не можемо имати и нешто попут доле:
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) Шта је генерички низ?
Одговор: Низови који су независни од типа података и чија се врста информација процењује током извођења су генерички низови. Генерички су слични шаблонима на језику Ц ++.
П # 2) Можете ли створити генерички низ у Јави?
Одговор: Низови су коваријантни у Јави, тј. Било којем низу поткласе може бити додељен низ супертипа. Генерички су, међутим, инваријантни, тј. Не можете доделити поље типа подкласе типу суперкласе.
Друго, генеричке информације се уклањају из ЈВМ-а, па стога низ чија се додела меморије врши током извршавања не зна који тип треба доделити низу. Стога се низови и генерички подаци не слажу добро у Јави.
П # 3) Шта је Тип Е у Јави?
Одговор: делује као чувар места за генеричке производе и представља било коју врсту елемената.
П # 4) Шта је брисање типова у Јави?
Одговор: Процес који проводи Јава компајлер којим се параметарски типови који се користе у генеричким подацима уклањају и пресликавају на сирове типове у бајт коду. Као такав, бајт код не садржи никакве информације о генеричким производима.
П # 5) Шта је сирови тип у Јави?
Одговор: Сирови типови су генерички типови без употребе параметра типа. На пример. Листа је сирови тип; док је Листа параметарски тип.
Закључак
У Јави се генерички низ не може директно дефинисати, тј. Не можете имати параметарски тип додељен референци низа. Међутим, користећи низове објеката и одразне функције, можете симулирати стварање генеричког низа.
Ова два приступа смо видели у овом упутству, заједно са детаљима генеричке грешке у стварању низа и могућностима да се таква грешка спречи. Укратко, на Јави можете рећи да низови и генерички подаци не иду руку под руку јер су низови коваријантни, док су генерички непроменљиви.
=> Овде погледајте савршен водич за обуку за Јава.
Препоручено читање
- Јава низ - Како исписати елементе низа у Јави?
- Водич за дужину Јава низа са примерима кода
- Водич за Јава рефлексију са примерима
- Јава Арраи - Декларишите, направите и иницијализујте низ у Јави
- Увод у Јава низове и сродне концепте
- Водич за генеричке Јава са примерима
- Јава СВИНГ лекције: Контејнери, компоненте и руковање догађајима
- Јава типови података, петље, низови, прекидачи и тврдње