Тхе Јава Генерицс програмирање је уведено у Ј2СЕ 5 за рад са објектима безбедним за тип. То чини код стабилним откривањем грешака у време компајлирања.
јава за типове петљи
Пре генеричких, можемо да ускладиштимо било коју врсту објеката у колекцији, тј. негенеричке. Сада генерици приморавају јава програмера да складишти одређену врсту објеката.
Предност Јава Генерицс-а
Постоје углавном 3 предности генерика. Они су следећи:
1) Безбедност типа: Можемо држати само једну врсту објеката у генерицима. Не дозвољава складиштење других објеката.
Без Генерика, можемо да складиштимо било коју врсту објеката.
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) Изливање типа није потребно: Нема потребе за куцањем објекта.
Пре Генерицс, морамо да откуцамо цаст.
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
Пример да користите Генерицс у Јави
ArrayList
Потпуни пример генерика у Јави
Овде користимо класу АрраиЛист, али можете користити било коју класу колекције као што су АрраиЛист, ЛинкедЛист, ХасхСет, ТрееСет, ХасхМап, Цомпаратор итд.
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
Пример Јава Генерицс који користе Мап
Сада ћемо користити елементе мапе користећи генерике. Овде треба да пренесемо кључ и вредност. Хајде да то разумемо на једноставном примеру:
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
Генеричка класа
Класа која се може односити на било који тип позната је као генеричка класа. Овде користимо параметар типа Т за креирање генеричке класе одређеног типа.
Хајде да видимо једноставан пример за креирање и коришћење генеричке класе.
Креирање генеричке класе:
class MyGen{ T obj; void add(T obj){this.obj=obj;} T get(){return obj;} }
Тип Т означава да се може односити на било који тип (као што су Стринг, Интегер и Емплоиее). Тип који наведете за класу ће се користити за чување и преузимање података.
дизајн шаблони јава
Коришћење генеричке класе:
Хајде да видимо код за коришћење генеричке класе.
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
Параметри типа
Конвенције именовања параметара типа су важне за темељно учење генерика. Уобичајени параметри типа су следећи:
блокирани контакти
- Т - Тип
- Е - Елемент
- К - Кључ
- Н - Број
- В - Вредност
Генеричка метода
Као и генеричка класа, можемо креирати генерички метод који може да прихвати било коју врсту аргумената. Овде је опсег аргумената ограничен на метод где је декларисан. Омогућава статичке и нестатичке методе.
Хајде да видимо једноставан пример Јава генеричке методе за штампање елемената низа. Овде користимо И за означавање елемента.
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
Вилдцард у Јава Генерицс
Тхе ? (знак питања) симбол представља џокер елемент. То значи било коју врсту. Ако напишемо , то значи било коју подређену класу броја, нпр. Интегер, Флоат и доубле. Сада можемо да позовемо метод класе Нумбер кроз било који објекат класе деце.
Можемо користити џокер знак као а тип параметра, поља, тип повратка или локална променљива. Међутим, није дозвољено користити џокер знак као аргумент типа за позивање генеричког метода, креирање инстанце генеричке класе или супертип .
Хајде да то разумемо на примеру датом у наставку:
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
Горње ограничени џокери
Сврха горње ограничених џокер знакова је да смање ограничења на променљиву. Она ограничава непознати тип да буде одређени тип или подтип тог типа. Користи се тако што се декларише џокер знак ('?') иза којег следи кључна реч ектендс (у случају, класа) или имплементс (у случају, интерфејс), након чега следи њена горња граница.
Синтакса
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
Унбоундед Вилдцардс
Неограничени џокер тип представља листу непознатог типа као што је Листа. Овај приступ може бити користан у следећим сценаријима: -
- Када се дата метода имплементира коришћењем функционалности обезбеђене у класи Објецт.
- Када генеричка класа садржи методе које не зависе од параметра типа.
Пример неограничених џокер знакова
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
Ловер Боундед Вилдцардс
Сврха доње ограничених џокер знакова је да ограниче непознати тип да буде специфичан тип или супертип тог типа. Користи се тако што се декларише џокер знак ('?') иза којег следи кључна реч супер, а затим њена доња граница.
Синтакса
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