java generic array how simulate generic arrays java
Цей підручник пояснює, як імітувати функціональність загального масиву в Java за допомогою масиву об’єктів, а також за допомогою класу відображення на простому прикладі:
Ми вже обговорювали Загальні засоби Java в одному з наших попередніх підручників. Java дозволяє загальні класи, методи тощо, які можуть бути оголошені незалежними від типів. Однак Java не дозволяє масиву бути загальним.
Причиною цього є те, що в Java масиви містять інформацію, що стосується їх компонентів, і ця інформація використовується для розподілу пам'яті під час виконання. Коли використовуються загальні засоби, через стирання типу байт-код не містить жодної загальної інформації.
=> Завітайте сюди, щоб вивчити Java з нуля.
Що ви дізнаєтесь:
Загальний масив у Java
Якщо ви визначили загальний масив, то тип компонента не буде відомий під час виконання. Тому недоцільно визначати масиви як загальні в Java.
Визначення загального масиву наведено нижче:
E () newArray = new E(length);
Компілятор не знає точного типу, який слід створити, оскільки інформація про тип недоступна під час виконання.
Отже, замість масивів, коли потрібні узагальнюючі засоби, ви повинні віддавати перевагу компоненту списку в рамках Java Collections. Однак ви можете створювати загальні структури, подібні до масивів, використовуючи масив об’єктів та функцію відображення Java.
Ці два підходи, що дозволяють нам визначити масиви різних типів даних, детально пояснюються нижче.
як обробляти спливаюче вікно в селені
Створення та ініціалізація загального масиву
У цьому розділі давайте створимо масивоподібну структуру, яка має загальний характер. Використовуючи ці структури, ви зможете створювати масиви, надаючи тип даних як аргумент.
Використання масиву об’єктів
Цей підхід використовує масив об’єктів типу як член основного класу масиву. Ми також використовуємо методи 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 Вихід:

безкоштовний приватний сервер world of warcraft - -
У наведеній вище програмі ми визначили клас Array, який є загальним. Об’єктний масив - це член класу, який створюється за допомогою конструктора та довжини. Ми також використовуємо загальні методи get і set, які використовуються для читання та встановлення елемента масиву певного типу.
Потім ми створюємо екземпляри цього класу масиву. Створюючи екземпляри, ми можемо вказати бажаний тип. У наведеній вище програмі ми створили два масиви типу Integer і String, а потім заповнюємо ці масиви відповідними значеннями (використовуючи метод set).
Нарешті, використовуючи замінений метод toString, ми відображаємо вміст кожного з цих примірників.
За допомогою Reflection
У цьому підході ми використовуємо клас відображення для створення загального масиву, тип якого буде відомий лише під час виконання.
Підхід подібний до попереднього, лише з однією різницею, тобто ми використовуємо клас відображення в самому конструкторі, щоб створити екземпляр масиву об'єктів, явно передаючи інформацію про тип даних конструктору класу.
Цей тип інформації передається до методу відображення 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)); } }
Вихід:

У наведеній вище програмі ми маємо перше твердження в основному методі, яке вказує на незмінність дженериків. Це твердження буде блимати помилкою компіляції (показано в коментарях). Наступне створення масиву відповідає правилам дженериків, і тому вони успішно компілюються.
Часті запитання
Q # 1) Що таке загальний масив?
Відповідь: Масиви, які не залежать від типу даних і чий тип інформації обчислюється під час виконання, є загальними масивами. Узагальнення подібні до шаблонів на C ++.
Q # 2) Чи можете ви створити загальний масив у Java?
Відповідь: Масиви коваріантні в Java, тобто будь-якому масиву підкласу можна призначити масив супертипу. Однак загальні засоби є незмінними, тобто ви не можете призначити масив типу підкласу типу суперкласу.
По-друге, загальна інформація видаляється з JVM і, отже, масив, виділення пам'яті якого виконується під час виконання, не знає, який тип слід призначити масиву. Таким чином, масиви та узагальнені засоби не поєднуються в Java.
Q # 3) Що таке тип E у Java?
Відповідь: діє як заповнювач для загальних препаратів і представляє будь-який тип елементів.
Q # 4) Що таке стирання типів у Java?
Відповідь: Процес, проведений компілятором Java, за допомогою якого параметризовані типи, що використовуються в узагальненнях, видаляються та відображаються у вихідних типах у байтовому коді. Таким чином, байт-код не містить жодної інформації про загальні препарати.
Q # 5) Що таке RAW-тип у Java?
Відповідь: Сировинні типи є загальними типами без використання параметра type. Наприклад Список - необроблений тип; тоді як List - це параметризований тип.
Висновок
У Java загальний масив не може бути визначений безпосередньо, тобто ви не можете мати параметризований тип, призначений посилання на масив. Однак, використовуючи масиви об’єктів та функції відображення, ви можете імітувати створення загального масиву.
Ми бачили ці два підходи в цьому посібнику разом із подробицями загальної помилки створення масиву та можливостями запобігти такій помилці. У двох словах, на Java можна сказати, що масиви та дженерики не йдуть рука об руку, оскільки масиви коваріантні, тоді як дженерики інваріантні.
=> Ознайомтесь з Ідеальним посібником з навчання Java тут.
Рекомендована література
- Java Array - Як надрукувати елементи масиву в Java?
- Підручник з довжини масиву Java із прикладами коду
- Підручник з роздумів про Java з прикладами
- Java Array - Оголошення, створення та ініціалізація масиву в Java
- Вступ до масивів Java та пов'язані з ними поняття
- Підручник з Java Generics з прикладами
- Підручник з Java SWING: Контейнер, компоненти та обробка подій
- Java-типи даних, цикли, масиви, комутатори та твердження