The Java Generics програмирането е въведено в J2SE 5 за работа с обекти, безопасни за типа. Това прави кода стабилен чрез откриване на грешки по време на компилиране.
mylivecricket.in
Преди генеричните, можем да съхраняваме всякакъв тип обекти в колекцията, т.е. негенерични. Сега генериците принуждават 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
Пълен пример за Generics в 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
Параметри на типа
Конвенциите за именуване на параметрите на типа са важни, за да научите задълбочено генериците. Параметрите на общия тип са както следва:
пътуване но
- T - Тип
- E - Елемент
- K - Ключ
- 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
? е заместващ знак.
се простира , е ключова дума.
Номер , е клас, присъстващ в пакета 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
Тук,
? е заместващ знак.
супер , е ключова дума.
Цяло число , е клас обвивка.
java 8
Да предположим, че искаме да напишем метода за списъка на 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