The Java Generics програмування представлено в J2SE 5 для роботи з безпечними типами об'єктів. Це робить код стабільним, виявляючи помилки під час компіляції.
як відкрити файл за допомогою java
До генериків ми можемо зберігати будь-які типи об’єктів у колекції, тобто не загальні. Тепер дженерики змушують програміста Java зберігати певний тип об’єктів.
Перевага Java Generics
В основному є 3 переваги дженериків. Вони такі:
1) Безпека типу: Ми можемо зберігати лише один тип об’єктів у генериках. Це не дозволяє зберігати інші об'єкти.
Без Generics ми можемо зберігати будь-які типи об’єктів.
List list = new ArrayList(); list.add(10); list.add('10'); With Generics, it is required to specify the type of object we need to store. List list = new ArrayList(); list.add(10); list.add('10');// compile-time error
2) Приведення типу не потрібне: Немає необхідності приведення об’єкта.
Перед Generics нам потрібно ввести cast.
List list = new ArrayList(); list.add('hello'); String s = (String) list.get(0);//typecasting After Generics, we don't need to typecast the object. List list = new ArrayList(); list.add('hello'); String s = list.get(0);
3) Перевірка під час компіляції: Це перевіряється під час компіляції, тому проблема не виникне під час виконання. Хороша стратегія програмування говорить, що набагато краще вирішити проблему під час компіляції, ніж під час виконання.
List list = new ArrayList(); list.add('hello'); list.add(32);//Compile Time Error
Синтаксис використовувати загальну колекцію
ClassOrInterface
приклад використовувати Generics у java
ArrayList
Повний приклад дженериків у Java
Тут ми використовуємо клас ArrayList, але ви можете використовувати будь-який клас колекції, наприклад ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator тощо.
які розміри екрана мого комп’ютера
import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }
import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }Перевірте зараз
Вихід:
element is: jai rahul jai
Приклад Java Generics з використанням Map
Тепер ми будемо використовувати елементи карти за допомогою генериків. Тут нам потрібно передати ключ і значення. Зрозуміємо це на простому прикладі:
import java.util.*; class TestGenerics2{ public static void main(String args[]){ Map map=new HashMap(); map.put(1,'vijay'); map.put(4,'umesh'); map.put(2,'ankit'); //Now use Map.Entry for Set and Iterator Set<map.entry> set=map.entrySet(); Iterator<map.entry> itr=set.iterator(); while(itr.hasNext()){ Map.Entry e=itr.next();//no need to typecast System.out.println(e.getKey()+' '+e.getValue()); } }} </map.entry></map.entry>Перевірте зараз
Вихід
1 vijay 2 ankit 4 umesh
Загальний клас
Клас, який може посилатися на будь-який тип, називається загальним класом. Тут ми використовуємо параметр типу T для створення загального класу певного типу.
Давайте розглянемо простий приклад створення та використання загального класу.
Створення загального класу:
class MyGen{ T obj; void add(T obj){this.obj=obj;} T get(){return obj;} }
Тип T вказує на те, що він може посилатися на будь-який тип (наприклад, String, Integer і Employee). Тип, який ви вкажете для класу, використовуватиметься для зберігання та отримання даних.
Використання загального класу:
Давайте подивимося код для використання загального класу.
class TestGenerics3{ public static void main(String args[]){ MyGen m=new MyGen(); m.add(2); //m.add('vivek');//Compile time error System.out.println(m.get()); }}Перевірте зараз
Вихід
2
Параметри типу
Правила іменування параметрів типу важливі для ретельного вивчення дженериків. Загальні параметри типу:
цикли java
- Т - Тип
- Е - Елемент
- К - ключ
- N - число
- V - Значення
Загальний метод
Як і загальний клас, ми можемо створити загальний метод, який може приймати будь-які типи аргументів. Тут область дії аргументів обмежена методом, у якому вони оголошені. Він дозволяє як статичні, так і нестатичні методи.
Давайте розглянемо простий приклад загального методу Java для друку елементів масиву. Ми використовуємо тут І для позначення елемента.
public class TestGenerics4{ public static void printArray(E[] elements) { for ( E element : elements){ System.out.println(element ); } System.out.println(); } public static void main( String args[] ) { Integer[] intArray = { 10, 20, 30, 40, 50 }; Character[] charArray = { 'J', 'A', 'V', 'A', 'T','P','O','I','N','T' }; System.out.println( 'Printing Integer Array' ); printArray( intArray ); System.out.println( 'Printing Character Array' ); printArray( charArray ); } }Перевірте зараз
Вихід
Printing Integer Array 10 20 30 40 50 Printing Character Array J A V A T P O I N T
Символ підстановки в Java Generics
? символ (знак питання) представляє елемент підстановки. Це означає будь-який тип. Якщо ми пишемо , це означає будь-який дочірній клас Number, наприклад, Integer, Float і double. Тепер ми можемо викликати метод класу Number через будь-який дочірній об’єкт класу.
Ми можемо використовувати символ підстановки як a тип параметра, поля, тип повернення або локальна змінна. Однак не дозволяється використовувати символ підстановки як аргумент типу для виклику загального методу, створення екземпляра загального класу або супертипу .
Давайте зрозуміємо це на прикладі, наведеному нижче:
import java.util.*; abstract class Shape{ abstract void draw(); } class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle');} } class GenericTest{ //creating a method that accepts only child class of Shape public static void drawShapes(List lists){ for(Shape s:lists){ s.draw();//calling method of Shape class by child class instance } } public static void main(String args[]){ List list1=new ArrayList(); list1.add(new Rectangle()); List list2=new ArrayList(); list2.add(new Circle()); list2.add(new Circle()); drawShapes(list1); drawShapes(list2); }}
Вихід
drawing rectangle drawing circle drawing circle
Символи підстановки з верхньою межею
Метою символів узагальнення з верхньою межею є зменшення обмежень на змінну. Він обмежує невідомий тип як певний тип або підтип цього типу. Він використовується шляхом оголошення символу узагальнення ('?'), за яким слідує ключове слово extends (у випадку, клас) або implements (у випадку, інтерфейс), а потім його верхня межа.
Синтаксис
List
тут,
? є символом підстановки.
поширюється , є ключовим словом.
Номер , є класом, присутнім у пакеті java.lang
Припустімо, ми хочемо написати метод для списку Number та його підтипів (наприклад, Integer, Double). Використання Список підходить для списку типу Number або будь-якого з його підкласів, тоді як Список працює лише зі списком типу Number. Так, Список є менш обмежувальним, ніж Список .
Приклад символу підстановки верхньої межі
У цьому прикладі ми використовуємо символи узагальнення верхньої межі, щоб написати метод для List і List.
import java.util.ArrayList; public class UpperBoundWildcard { private static Double add(ArrayList num) { double sum=0.0; for(Number n:num) { sum = sum+n.doubleValue(); } return sum; } public static void main(String[] args) { ArrayList l1=new ArrayList(); l1.add(10); l1.add(20); System.out.println('displaying the sum= '+add(l1)); ArrayList l2=new ArrayList(); l2.add(30.0); l2.add(40.0); System.out.println('displaying the sum= '+add(l2)); } }Перевірте зараз
Вихід
алфавіт з цифрами
displaying the sum= 30.0 displaying the sum= 70.0
Необмежені символи підстановки
Тип необмеженого символу підстановки представляє список невідомого типу, наприклад List. Цей підхід може бути корисним у таких сценаріях: -
- Коли заданий метод реалізовано за допомогою функціональності, наданої в класі Object.
- Коли загальний клас містить методи, які не залежать від параметра типу.
Приклад необмежених символів підстановки
import java.util.Arrays; import java.util.List; public class UnboundedWildcard { public static void display(List list) { for(Object o:list) { System.out.println(o); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println('displaying the Integer values'); display(l1); List l2=Arrays.asList('One','Two','Three'); System.out.println('displaying the String values'); display(l2); } }Перевірте зараз
Вихід
displaying the Integer values 1 2 3 displaying the String values One Two Three
Символи підстановки з нижньою межею
Мета символів підстановки з нижньою межею полягає в тому, щоб обмежити невідомий тип певним типом або супертипом цього типу. Він використовується шляхом оголошення символу узагальнення ('?'), за яким слідує ключове слово super і його нижня межа.
Синтаксис
List
тут,
? є символом підстановки.
супер , є ключовим словом.
Ціле число , є класом-огорткою.
math pow java
Припустимо, ми хочемо написати метод для списку Integer і його супертипу (наприклад, Number, Object). Використання Список підходить для списку типу Integer або будь-якого з його суперкласів, тоді як Список працює лише зі списком типу Integer. Так, Список є менш обмежувальним, ніж Список .
Приклад символу підстановки нижньої межі
У цьому прикладі ми використовуємо символи узагальнення нижньої межі, щоб написати метод для List і List.
import java.util.Arrays; import java.util.List; public class LowerBoundWildcard { public static void addNumbers(List list) { for(Object n:list) { System.out.println(n); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println('displaying the Integer values'); addNumbers(l1); List l2=Arrays.asList(1.0,2.0,3.0); System.out.println('displaying the Number values'); addNumbers(l2); } }Перевірте зараз
Вихід
displaying the Integer values 1 2 3 displaying the Number values 1.0 2.0 3.0