java generics tutorial with examples
Јава генерички су скуп функција које омогућавају писање кода неовисно о типу података. Овај чланак детаљно објашњава Јава Генерицс са примерима:
Генерички производи су једна од важних карактеристика Јаве и представљени су од Јаве 5 надаље.
По дефиницији, генерички су скуп карактеристика Јава језика који програмеру омогућавају да користи генеричке типове и функције и тако осигурава сигурност типова.
Шта ћете научити:
Како генерички производи функционишу у Јави?
Ако сте раније радили са Ц ++, онда је Јава Генерицс исто што и шаблони у Ц ++. Јава Генерицс вам омогућава да у дефиницију класе / методе укључите параметар који ће имати вредност примитивног типа података.
На пример, можете имати генеричку класу „Низ“ на следећи начин:
Низ предмета {….}
Где је параметризовани тип.
Даље, можете створити објекте за ову класу на следећи начин:
Array int_array = new Array () Array char_array = new Array ();
Дакле, с обзиром на генеричку параметарску класу, можете да креирате објекте исте класе са различитим типовима података као параметрима. Ово је главна суштина употребе Јава Генерицс-а.
Слично томе, можете написати генеричку методу с параметризираним типом за сортирање низа, а затим инстанцирати ову методу било којем примитивном типу.
Јава Генерицс се углавном користе са колекционим оквиром Јаве. Различите колекције попут ЛинкедЛист, Лист, Мап, ХасхМап итд. Користе Генерицс за имплементацију. Генерички производи пружају сигурност типа јер се провера типа врши у време компајлирања, што чини ваш код стабилнијим.
Хајде сада више о детаљима генеричких класа и метода као и о другим сродним темама.
Генеричке класе
Генеричка класа је иста као и нормална класа, с тим што име класе прати тип у угластим заградама.
Општа дефиниција генеричке класе је следећа:
цласс цласс_наме
{
променљиве класе;
… ..
методе класе;
}
Једном када је класа дефинисана, можете да креирате објекте било ког типа података који желите на следећи начин:
class_name obj = new class_name ();
На пример, за Интегер објекат декларација ће бити:
class_name obj = new class_name;
Слично томе, за тип података Стринг објект ће бити:
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()); } }
Излаз:
У горњем програму, класа МиГенерицЦласс је генеричка класа. Има две методе, тј. Додај и добије. Метода адд иницијализује генерички објекат док методе гет враћају објекат.
У главној функцији декларишемо по два објекта типа Интегер и Стринг. Оба ова објекта иницијализујемо одговарајућим почетним вредностима помоћу методе адд, а затим излазним садржајем ових објеката користимо методу гет.
Горе смо представили пример генеричке класе са једним параметром типа. Али у стварности, класа може имати и више параметара типа. У овом случају, параметри типа одвојени су зарезом.
Следећи пример то показује:
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(); } }
Излаз:
У овом програму имамо два параметра типа, тј. Т1 и Т2. Имамо функције за иницијализацију објеката чланова и такође за штампање садржаја. У главној функцији декларишемо објекат са два типа, тј. Стринг и Интегер. Излаз програма приказује садржај креираног објекта.
Баш као и часови, можете имати и генеричке интерфејсе. Све о интерфејсима ћемо научити у посебној теми.
Јава генеричке методе
Као што можете имати генеричке класе и интерфејсе, тако можете имати и генеричке методе у случају да вам није потребна цела класа да бисте били генерички.
Следећи програм приказује примену генеричке методе „принтГенерицАрраи“. Обратите пажњу на позив методе у главној функцији. Овде упућујемо два позива генеричкој методи, први пут са типом, а затим са типом.
како створити листу Јава
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 ); } }
Излаз:
Ограничени параметри типа
Параметри ограничених типова долазе у слику када желите да ограничите типове података у општем облику. На пример, ако желите да одређена генеричка класа или метода или било који интерфејс треба да ради само за нумеричке типове података, онда то можете одредити помоћу кључне речи „ектендс“.
Ово је приказано испод:
List myList = new ArrayList(); List list1 = new ArrayList();
Преводитељ ће прихватити горње две декларације јер су Лонг и Интегер подкласе Нумбер.
Следећа декларација, међутим, представљаће проблем.
List list = new ArrayList();
То ће довести до грешке током компајлирања, јер Стринг није број. Симбол „?“ У горњем примеру познат је као џокер знак, а ми ћемо о њему разговарати даље.
Дакле, генерално се ограничени параметри типа углавном користе када желите да ограничите типове података који ће се користити у вашем генеричком коду.
Надомештај Јава Генерицс
На Јави се џокер означава упитником „?“ Који се користи за означавање непознатог типа. Замењиви знакови се углавном користе са генеричким средствима као тип параметра.
Када користите генеричке џокерске знакове, морате запамтити једну тачку да, иако је објекат суперкласа свих осталих класа, колекција објеката ( На пример, Листа) није суперкласа свих осталих колекција.
Поред тога што се користи као тип параметра, замјенски знак можете користити и као поље, локалну варијаблу и као такву. Међутим, никада не можете да користите џокер као надтип или као аргумент типа за позивање генеричке методе или у случају стварања инстанце генеричке класе.
Постоји много примера дивљих параметризованих типова (овде је бар један аргумент типичног знака) као што је приказано доле, а џокери коришћени на различитим местима тумачиће се различито:
- Збирка <: Колекција означава све инстанције интерфејса колекције, без обзира на коришћени аргумент типа.
- Листа extends Number< : Листа представља све типове листе где ће тип елемента бити број.
- Упоредник: Све инстанције интерфејса компаратора за аргументе типа који су Стрингсупертипес.
Имајте на уму да је параметарски тип замењивог правила правило које се намеће за препознавање важећих типова. То није конкретан тип података. Генерички џокери могу бити ограничени или неограничени.
# 1) Неограничени џокери
У неограниченим заменљивим знаковима нема ограничења за променљиве типа и означава се на следећи начин:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Ограничени џокери
Већ смо разговарали о ограниченим типовима. Они стављају ограничења на тип података који се користи за инстанцирање параметара типа помоћу кључних речи - ектендс или супер. Ови џокери се могу даље поделити на џокери са горњим ограничењем и доњи знакови са ограничењем.
- Горње ограничени џокери
Ако желите да ваш генерички израз важи за све поткласе датог типа, онда с кључном речи ектендс дефинишете горњи ограничени џокер.
На пример, претпоставимо да вам је потребан генерички метод који подржава Лист, Лист, итд., тада можете одредити горњи ограничени џокер попут Листа . Како је Нумбер суперкласа, овај генерички метод ће радити за све његове подкласе.
Следећи програм то показује.
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)); } }
Излаз:
Овде смо обезбедили надграђени џокер, Лист, аргументу типа функције „сумирање“. У главној функцији дефинишемо две листе, тј. Инт_лист типа Интегер и доублес_лист типа Доубле. Како су Интегер и Доубле поткласе Нумбер, збрајање функција савршено функционише на обе ове листе.
- Доњи ограничени џокери
Ако желите да генерички израз прихвати све суперкласе одређеног типа, онда можете да наведете доњи ограничени џокер за свој аргумент типа.
Пример примене за ово је дат у наставку:
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); } }
Излаз:
У овом програму, доњи ограничени џокер је назначен као „Листа“. Тада у главној функцији имамо списак типова и листу. Као што смо користили доњи ограничени џокер, класа Нумбер је суперкласа Интегер је ваљани аргумент типа.
Предности Јава генеричара
# 1) Безбедност типа
Генерички производи осигуравају сигурност типа. То значи да се провера типа врши у време компајлирања, а не у време извођења. Стога не постоји шанса да се током извођења добије „ЦлассЦастЕкцептион“ јер ће се користити исправни типови.
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) Поновна употреба кода
Користећи Генерицс, не морате писати засебан код за сваки тип података. Можете написати једну класу или методу итд. И користити је за све типове података.
# 3) Нема потребе за слањем типова
Како користите Генерицс, компајлер зна за типове који се користе, тада нема потребе за слањем типова.
Размотрите доњи код:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Као што видите када се користи нормална листа, потребно је да откуцате елемент листе на одговарајући тип онако како је то урађено за мистр горе.
Сада поново напишите исти код са генеричком листом.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Овде смо навели тип низа као генерички израз за декларацију листе. Стога, да бисмо пронашли појединачне елементе ове листе, не треба нам слати текстове.
# 4) Примена генеричких алгоритама
Можете да примените много више генеричких алгоритама када користите Генерицс за кодирање.
# 5) Провера времена компајлирања
Као што је већ поменуто, када у свом Јава програму користите Генерицс, компајлер проверава типове у време компајлирања, спречавајући тако абнормални прекид програма током извршавања.
Често постављана питања
П # 1) Зашто користимо генерике у Јави?
Одговор: Генерички подаци осигуравају независност типа, тј. Можемо пружити параметар типа приликом дефинисања класе / интерфејса / методе итд., Тако да током стварне инстанције можемо одредити стварни тип. На овај начин такође обезбеђујемо поновну употребу кода.
П # 2) Да ли су генерички производи важни у Јави?
Одговор: Да. У ствари, генерички су најважније карактеристике Јава-а да би се осигурала сигурност типа, тј. Провера типа током времена компајлирања.
П # 3) Када је Јава додала генеричке?
Одговор: Генерички су додани у Јаву 2004. године са Ј2СЕ 5.0 са намером да се осигура сигурност типа компајлирања у Јави.
П # 4) Шта је генерички тип?
Одговор: Генерички тип је генеричка класа, интерфејс или метода који се добија са параметром типа. Ово омогућава сигурност типова и поновну употребу кода.
П # 5) Можемо ли користити генерике са Арраи-ом у Јави?
Одговор: Не. Јава не дозвољава генеричке низове.
Закључак
Овим је завршен туторијал о Јава генеричким производима који се сматра једном од најважнијих карактеристика у новијим Јава верзијама. Коришћење Генерицс-а у Јава програмима осигурава сигурност типова као и поновну употребу кода. Такође обезбеђује проверу времена компајлирања како се програм не би покварио током извођења.
Јава генеричари добро долазе углавном са интерфејсом Јава колекција, о чему ћемо детаљно разговарати у другом упутству из ове серије.
како оловком тестирати веб локацију
Срећно читање !!
Препоручено читање
- 15 најбољих ЈАВА алата за развој, изградњу, профилирање, покривање кода и преглед
- Водич за Јава Цоллецтионс Фрамеворк (ЈЦФ)
- Јава типови података, петље, низови, прекидачи и тврдње
- Примена Јава-а: Стварање и извршавање Јава ЈАР датотеке
- Јава изузеци и руковање изузецима са примерима
- Водич за ЈАВА за почетнике: 100+ практичних Јава видео водича
- Водич за Јава рефлексију са примерима
- Јава 'тхис' кључна реч: Водич са примерима кода