java generics tutorial with examples
Java Generics - це набір функцій, які дозволяють писати код незалежно від типу даних. Ця стаття детально пояснює приклади Java Generics.
Універсальні ліки є однією з важливих особливостей Java і були введені з Java 5 і далі.
За визначенням, Generics - це набір функцій мови Java, які дозволяють програмісту використовувати загальні типи та функції і, таким чином, забезпечують безпеку типів.
Що ви дізнаєтесь:
Як працюють дженерики на Java?
Якщо ви вже працювали з C ++, то Java Generics - це те саме, що шаблони в C ++. Java Generics дозволяє включити параметр у визначення вашого класу / методу, який матиме значення примітивного типу даних.
Наприклад, ви можете мати загальний клас “Array” наступним чином:
Масив класів {….}
Де параметризований тип.
Далі ви можете створити об’єкти для цього класу наступним чином:
Array int_array = new Array () Array char_array = new Array ();
Отже, враховуючи загальний параметризований клас, ви можете створювати об’єкти одного класу з різними типами даних як параметрами. Це основна суть використання Java Generics.
Подібним чином ви можете написати загальний метод із параметризованим типом для сортування масиву, а потім створити екземпляр цього методу для будь-якого примітивного типу.
Java Generics в основному використовуються в рамках колекцій Java. Різні колекції, такі як LinkedList, List, Map, HashMap тощо, використовують Generics для реалізації. Загальні засоби забезпечують безпеку типу, оскільки перевірка типу виконується під час компіляції, що робить ваш код стабільнішим.
Давайте тепер детальніше розглянемо загальні класи та методи, а також інші суміжні теми.
Загальні класи
Загальний клас - це те саме, що і звичайний клас, за винятком того, що за назвою класу слідує тип у кутових дужках.
Загальне визначення загального класу є таким:
клас class_name
{
змінні класу;
… ..
методи класу;
}
Після того, як клас визначено, ви можете створювати об'єкти будь-якого типу даних, який вам потрібно, наступним чином:
як додати речі до масиву
class_name obj = new class_name ();
Наприклад, для об'єкта Integer оголошення буде таким:
class_name obj = new class_name;
Аналогічно, для типу даних String об’єктом буде:
class_name str_Obj = new class_name;
Приклад реалізації для загального класу наведено нижче.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Вихід:
У наведеній вище програмі клас MyGenericClass є загальним класом. Він має два методи, тобто додавання та отримання. Метод add ініціалізує загальний об’єкт, тоді як методи get повертають об’єкт.
У головній функції ми оголошуємо два об'єкти типу Integer і String. Ми ініціалізуємо обидва ці об’єкти відповідними початковими значеннями за допомогою методу add, а потім виводимо вміст цих об’єктів за допомогою методу get.
Ми представили приклад загального класу вище з одним параметром типу. Але насправді клас може також мати кілька параметрів типу. У цьому випадку параметри типу розділяються комою.
Наступний приклад демонструє це:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Вихід:
У цій програмі ми маємо два параметри типу, тобто T1 і T2. У нас є функції для ініціалізації об’єктів-членів, а також для друку вмісту. У головній функції ми оголошуємо об'єкт двох типів, тобто String та Integer. На виході програми відображається вміст створеного об'єкта.
Так само, як класи, ви також можете мати загальні інтерфейси. Все про інтерфейси ми дізнаємось в окремій темі.
запити oracle sql інтерв’ю запитання та відповіді для досвідчених
Загальні методи Java
Подібно до того, як ви можете мати загальні класи та інтерфейси, ви також можете мати загальні методи, якщо вам не потрібен цілий клас, щоб бути загальним.
Наступна програма демонструє реалізацію загального методу “printGenericArray”. Зверніть увагу на виклик методу в головній функції. Тут ми робимо два виклики загального методу, спочатку з типом, а потім з типом.
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Вихід:
Параметри обмеженого типу
Параметри обмеженого типу з’являються, коли ви хочете обмежити типи даних у Generics. Наприклад, якщо ви хочете, щоб певний загальний клас або метод або будь-який інтерфейс працював лише для числових типів даних, тоді ви можете вказати це за допомогою ключового слова “extends”.
Це показано нижче:
List myList = new ArrayList(); List list1 = new ArrayList();
Наведені вище два оголошення будуть прийняті компілятором, оскільки Long і Integer є підкласами Number.
Однак наступна декларація буде проблемою.
List list = new ArrayList();
Це призведе до помилки під час компіляції, оскільки рядок не є числом. Символ «?» У наведеному вище прикладі відомий як підстановочний знак, і ми обговоримо його далі.
Отже, загалом, обмежені параметри типу в основному використовуються, коли ви хочете обмежити типи даних, які будуть використовуватися у вашому загальному коді.
Узагальнювач Java Generics
На Java символи підстановки позначаються знаком питання «?», Який використовується для позначення невідомого типу. Узагальнюючі символи в основному використовуються із дженериками як типом параметра.
Використовуючи загальні узагальнюючі символи, ви повинні пам’ятати один момент: хоча об’єкт є суперкласом усіх інших класів, колекція об’єктів ( Наприклад, List) не є надкласом усіх інших колекцій.
Окрім того, що він використовується як тип параметра, ви можете використовувати підстановочний знак як поле, локальну змінну та як таку. Однак ви ніколи не можете використовувати підстановочний знак як супертип або як аргумент типу для виклику загального методу або у випадку створення екземпляра загального класу.
Існує багато прикладів параметризованих типів підстановочних знаків (тут принаймні один аргумент типу є підстановочним знаком), як показано нижче, і підстановочні знаки, що використовуються в різних місцях, будуть тлумачитися по-різному:
- Колекція <: Колекція позначає всі екземпляри інтерфейсу колекції незалежно від використовуваного аргументу типу.
- Список extends Number< : Список представляє всі типи списків, де типом елемента буде число.
- Компаратор: Усі екземпляри інтерфейсу порівняння для аргументів типу, які є Stringsupertypes.
Зверніть увагу, що параметризований тип підстановки - це правило, яке накладається на розпізнавання дійсних типів. Це не конкретний тип даних. Загальні символи підстановки можуть бути обмеженими або необмеженими.
# 1) Необмежені символи підстановки
У необмежених узагальнюючих знаках немає обмежень на змінні типу і позначається таким чином:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Обмежені символи підстановки
Ми вже обговорювали обмежені типи. Вони встановлюють обмеження на тип даних, що використовується для створення параметрів типу за допомогою ключових слів - розширення або супер. Ці узагальнюючі символи можна розділити на підстановочні знаки верхньої та нижньої зв’язків.
- Верхні обмежені символи
Якщо ви хочете, щоб ваш загальний вираз був дійсним для всіх підкласів даного типу, тоді ви вказуєте верхній обмежений шаблон із ключовим словом extends.
Наприклад, припустимо, вам потрібен загальний метод, що підтримує List, List тощо, тоді ви можете вказати верхній обмежений підстановочний знак, наприклад Список . Оскільки Number є суперкласом, цей загальний метод буде працювати для всіх його підкласів.
Наступна програма це демонструє.
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Вихід:
Тут ми надали верхню межу шаблону 'Список' для аргументу типу функції 'підсумовування'. У головній функції ми визначаємо два списки, тобто int_list типу Integer і doubles_list типу Double. Оскільки Integer і Double є підкласами Number, функція підсумовування чудово працює в обох цих списках.
- Нижні обмежені символи
Якщо ви хочете, щоб узагальнений вираз прийняв усі суперкласи певного типу, ви можете вказати нижній обмежений шаблон для аргументу вашого типу.
Приклад реалізації для цього наведено нижче:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Вихід:
У цій програмі вказаний нижній знак підстановки - “Список”. Тоді в основній функції ми маємо список типів і список. Оскільки ми використовували нижній обмежений шаблон, клас Number - це суперклас Integer - це допустимий аргумент типу.
Переваги Java Generics
# 1) Тип безпеки
Дженерики забезпечують безпеку типу. Це означає, що перевірка типу виконується під час компіляції, а не під час виконання. Таким чином, немає шансів отримати “ClassCastException” під час виконання, оскільки будуть використовуватися правильні типи.
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
У наведеній вище програмі ми маємо два списки, один без дженериків, а інший із дженериками. У не-загальному списку немає Типу безпеки. Ви можете додати ціле число, рядок тощо як елемент, і це прийнято.
У загальному списку ви можете додати лише один тип елемента, який вказаний у загальному виразі. Якщо ви намагаєтесь додати елемент іншого типу, це призводить до помилки під час компіляції.
У наведеній вище програмі помилка часу компіляції блимає в рядку:
list.add('10');
# 2) Повторне використання коду
Використовуючи Generics, вам не потрібно писати окремий код для кожного типу даних. Ви можете написати один клас або метод тощо і використовувати його для всіх типів даних.
# 3) Немає необхідності в видаванні шрифтів
Оскільки ви використовуєте Generics, компілятор знає про використовувані типи, тоді немає необхідності в типовому розкладі.
Розглянемо наведений нижче код:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Як бачите, коли використовується звичайний список, вам потрібно ввести елемент списку до відповідного типу, як це робиться для mystr вище.
Тепер напишемо той самий код ще раз із загальним списком.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Тут ми вказали тип рядка як загальний вираз для оголошення списку. Таким чином, щоб отримати окремі елементи цього списку, нам не потрібно вводити текст.
# 4) Впровадження загальних алгоритмів
Ви можете застосувати набагато більше загальних алгоритмів, коли використовуєте Generics для кодування.
найкращий конвертер youtube в mp4 -
# 5) Перевірка часу компіляції
Як уже зазначалося, коли ви використовуєте Generics у своїй програмі Java, компілятор перевіряє типи під час компіляції, таким чином запобігаючи аномальному завершенню роботи програми під час виконання.
Часті запитання
Q # 1) Чому ми використовуємо Generics в Java?
Відповідь: Дженерики забезпечують незалежність типу, тобто ми можемо надати параметр типу, визначаючи клас / інтерфейс / метод тощо, так що під час фактичного створення екземпляра ми можемо вказати фактичний тип. Таким чином ми також забезпечуємо можливість повторного використання коду.
Запитання №2. Чи важливі загальні засоби в Java?
Відповідь: Так. Насправді, Generics - це найважливіші особливості Java для забезпечення безпеки типу, тобто перевірка часу компіляції.
Q # 3) Коли Java додала Generics?
Відповідь: Загальні засоби були додані до Java у 2004 році з J2SE 5.0 з метою забезпечення безпеки типу компіляції в Java.
Q # 4) Що таке загальний тип?
Відповідь: Загальний тип - це загальний клас, інтерфейс або метод, що забезпечується параметром типу. Це дозволяє забезпечити безпеку типу та повторне використання коду.
Q # 5) Чи можемо ми використовувати Generics з Array в Java?
Відповідь: Ні. Java не дозволяє загальні масиви.
Висновок
На цьому завершується підручник із загальних джерел Java, який вважається однією з найважливіших функцій в останніх версіях Java. Використання Generics у програмах Java забезпечує безпеку типу, а також повторне використання коду. Це також забезпечує перевірку часу компіляції, щоб програма не зламалася під час виконання.
Узагальнення Java корисні переважно в інтерфейсі колекцій Java, про що ми детально поговоримо в іншому посібнику з цієї серії.
Щасливого читання !!
Рекомендована література
- 15 найкращих інструментів JAVA для розробки, побудови, профілювання, охоплення коду та огляду
- Підручник з Java Collections Framework (JCF)
- Java-типи даних, цикли, масиви, комутатори та твердження
- Розгортання Java: створення та виконання файлу Java JAR
- Винятки Java та обробка винятків з прикладами
- Підручник JAVA для початківців: 100+ практичних навчальних посібників Java
- Підручник з роздумів про Java з прикладами
- Ключове слово Java 'this': Підручник із прикладами коду