Isifundo seJava Generics -Zithini iiGenerics kwaye uzisebenzisa njani?

IJava Generics yenye yezona zinto zibalulekileyo kulwimi lweJava. Uluvo olungemva kokuveliswa kwezinto lulula, nangona kunjalo, ngamanye amaxesha luza lintsokothe ​​ngenxa yotshintsho kwis syntax yesiqhelo enxulunyaniswa nayo.

Injongo yale khokelo kukukwazisa kule ngcamango ebalulekileyo yezobugcisa ngendlela elula yokuyiqonda.

Kodwa ngaphambi kokuntywila kwiijenerikhi ngokwazo, makhe siqonde ukuba kutheni iijenics zeJava zazifuneka kwasekuqaleni.




Injongo yeJava Generics

Phambi kokungeniswa kwegeneric kwiJava 5, ungabhala kwaye uqokelele ikhowudi enje ngale ngaphandle kokuphosa impazamo okanye isilumkiso:

List list = new ArrayList(); list.add('hey'); list.add(new Object());

Unokongeza amaxabiso alo naluphi na uhlobo kuluhlu okanye kolunye uluhlu lweJava ngaphandle kokuxela ukuba loluphi uhlobo lwedatha eligcinayo. Kodwa xa ubuyisa amaxabiso kuluhlu, kuya kufuneka uliphose ngokucacileyo kuhlobo oluthile.


Qwalasela ukuphindaphinda kolu luhlu lungentla.

for (int i=0; i< list.size(); i++) {
String value = (String) list.get(i); //CastClassException when i=1 }

Ukuvumela ukwenziwa kwoluhlu ngaphandle kokuqala ukubhengeza uhlobo lwedatha egciniweyo, njengoko senzile, kunokubangela ukuba abadwelisi benkqubo benze iimpazamo ezinje ngentla eziphosayo ClassCastExceptions Ngexesha lokubaleka.

Iijenerikhi zaziswa ukuthintela abaqhubi ukuba benze ezo mpazamo.

Nge generics, ungabhengeza ngokucacileyo uhlobo lwedatha oluza kugcinwa xa kusenziwa ingqokelela yeJava njengoko lo mzekelo ulandelayo ubonisa.


Phawula:Usenokwenza into yokuqokelela iJava ngaphandle kokuchaza uhlobo lwedatha egciniweyo kodwa ayikhuthazwa. List stringList = new ArrayList();

Ngoku, ngekhe ngempazamo ugcine inani elipheleleyo kuluhlu lomtya ngaphandle kokuphosa impazamo yexesha lokudibanisa. Oku kuqinisekisa ukuba inkqubo yakho ayisebenzi kwiimpazamo zexesha lokusebenza.

stringList.add(new Integer(4)); //Compile time Error

Eyona njongo iphambili yokwazisa iijenikhi kwiJava yayikukuthintela ukubaleka ungene ClassCastExceptions ngexesha lokubaleka.



Ukudala iJava Generics

Ungasebenzisa iijenerikhi ukwenza iiklasi zeJava kunye neendlela. Makhe sijonge kwimizekelo yendlela yokwenza i-generics yohlobo ngalunye.

Iklasi yohlobo oluqhelekileyo

Xa usenza udidi oluqhelekileyo, uhlobo lweparameter yeklasi longezwa ekupheleni kwegama leklasi ngaphakathi kwe-angle izibiyeli.


public class GenericClass {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return this.item;
} }

Apha, T yiparameter yohlobo lwedatha. T, N, kunye E Olunye loonobumba abasetyenziselwa uhlobo lweedatha ngokommiselo weJava.

Kumzekelo ongentla, ungawudlulisa uhlobo oluthile lwedatha xa usenza into yeGenericClass.

public static void main(String[] args) {
GenericClass gc1 = new GenericClass();
gc1.setItem('hello');
String item1 = gc1.getItem(); // 'hello'
gc1.setItem(new Object()); //Error
GenericClass gc2 = new GenericClass();
gc2.setItem(new Integer(1));
Integer item2 = gc2.getItem(); // 1
gc2.setItem('hello'); //Error }

Awunakho ukudlulisa uhlobo lwedatha yakudala kwidatha yohlobo lwedatha xa usenza into yeklasi yohlobo. Ziindidi zedatha kuphela ezandisa uhlobo lwento ezinokugqithiswa njengeeparameter zohlobo.

Umzekelo:


GenericClass gc3 = new GenericClass(); //Error

Iindlela eziqhelekileyo

Ukwenza iindlela zokwenza generic kulandela ipateni efanayo yokwenza iiklasi zohlobo oluqhelekileyo. Unokuphumeza indlela enje generic ngaphakathi kudidi oluqhelekileyo kunye non-generic.

public class GenericMethodClass {
public static void printItems(T[] arr){
for (int i=0; i< arr.length; i++) {

System.out.println(arr[i]);
}
}
public static void main(String[] args) {
String[] arr1 = {'Cat', 'Dog', 'Mouse'};
Integer[] arr2 = {1, 2, 3};

GenericMethodClass.printItems(arr1); // 'Cat', 'Dog', 'Mouse'
GenericMethodClass.printItems(arr2); // 1, 2, 3
} }

Apha, ungadlulisa uluhlu lodidi oluthile lokumisela indlela. Indlela eqhelekileyo PrintItems() ihamba ngokulandelelana kwaye iprinta izinto ezigcinwe ngendlela eqhelekileyo yeJava.



Uhlobo lweparameter yohlobo

Ukuza kuthi ga ngoku, iiklasi zohlobo oluqhelekileyo kunye neendlela esizenzileyo apha ngasentla zinokubekwa kumgangatho kulo naluphi na uhlobo lwedatha ngaphandle kweentlobo zamandulo. Kodwa kuya kuthini ukuba sifuna ukukhawulela iintlobo zeedatha ezinokudluliselwa kubenzi? Kulapho uhlobo olunqamlezileyo lweparamitha lungena khona.

Ungazibophelela iintlobo zeedatha ezamkelweyo zodidi oluqhelekileyo okanye indlela ngokuchaza ukuba kufuneka ibe yinkqutyana yolunye uhlobo lwedatha.


Umzekelo:

//accepts only subclasses of List public class UpperBoundedClass{
//accepts only subclasses of List
public void UpperBoundedMethod(T[] arr) {
} }

Apha, UpperBoundedClass kunye UpperBoundedMethod unokwenziwa umgaqo kuphela xa usebenzisa ii-subtypes ze List uhlobo lwedatha.

List Uhlobo lwedatha lusebenza njengombophelelo kuhlobo lweparadesi. Ukuba uzama ukusebenzisa uhlobo lwedatha olungeyiyo i-subtype ye List, iya kuyiphosa impazamo yexesha lokudityaniswa.

Imida ayikhawulelwanga kwiiklasi kuphela. Unokudlula unxibelelwano ngokunjalo. Ukwandisa ujongano kuthetha, kule meko, ukuphumeza ujongano.

Ipharamitha inokuba nemida emininzi njengalo mzekelo ubonisa.

//accepts only subclasses of both Mammal and Animal public class MultipleBoundedClass{
//accepts only subclasses of both Mammal and Animal
public void MultipleBoundedMethod(T[] arr){
} }

Uhlobo lwedatha eyamkelekileyo kufuneka lube ludidi lweZilwanyana kunye neeklasi zoMzimba. Ukuba omnye wale mida yiklasi, kufuneka ize kuqala kwisibhengezo esibophelelweyo.

Kumzekelo ongentla, ukuba uMammal udidi kunye nezilwanyana zijongano, Isilwanyana kufuneka size kuqala njengoko kubonisiwe apha ngasentla. Ngaphandle koko, ikhowudi iphosa impazamo yexesha lokudibanisa.



Iikhowudi zeJava zeGenerics

Amakhadi asendle asetyenziselwa ukudlulisa iiparameter zeentlobo zegeneric kwiindlela. Ngokungafaniyo nendlela eqhelekileyo, apha, iparameter yohlobo oluqhelekileyo igqithiselwa kwiiparameter ezamkelweyo yindlela, eyahlukileyo kuhlobo lwedatha esikuxubileyo ngasentla. Ikhadi lasendle limelwe ngu? uphawu.

public void printItems(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

Oku kungasentla printItems() indlela yamkela uluhlu lwalo naluphi na uhlobo lwedatha njengeparameter. Oku kuthintela abaprogram ukuba baphindaphinde iikhowudi zoluhlu lweentlobo ezahlukeneyo zedatha, eya kuba njalo ngaphandle kwe-generics.

Amakhadi ama-Wildcards aphezulu

Ukuba sifuna ukukhawulela iintlobo zeedatha ezigcinwe kuluhlu olwamkelweyo yindlela, sinokusebenzisa amakhadi asendle ebotshelelwe.

Umzekelo:

public void printSubTypes(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

printSubTypes() indlela yamkela kuphela uluhlu olugcina ii-subtypes zoMbala. Yamkela uluhlu lwezinto zeRedColor okanye zeBlueColor, kodwa alwamkeli uluhlu lwezinto zezilwanyana. Kungenxa yokuba izilwanyana azilulo udidi lombala. Lo ngumzekelo wekhadi lasendle eliboshwe ngaphezulu.

Amakhadi asendle amdaka asezantsi

Ngokufanayo, ukuba besine:

public void printSuperTypes(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

emva koko, printSuperTypes() indlela yamkela kuphela uluhlu olugcina iintlobo eziphezulu zeklasi yenja. Iya kwamkela uluhlu lwezinto eziManyeneyo okanye zezilwanyana kodwa hayi uluhlu lwezinto zeLabDog kuba iLabDog ayisiyiyo inja enkulu, kodwa iyinto encinci. Lo ngumzekelo wekhadi lasendle elibotshelelwe ezantsi.



Isiphelo

IJava Generics sele iyinto engenziwa ngabantu benkqubo ngaphandle kokungeniswa kwayo.

Olu thando lubangelwa yimpembelelo yalo ekwenzeni iinkqubo zobomi zibe lula. Ngaphandle kokubathintela ekwenzeni iimpazamo zokufaka iikhowudi, ukusetyenziswa kwegeneric kwenza ukuba ikhowudi ingaphindaphindeki. Ngaba uqaphele ukuba ikwenza ngokubanzi iiklasi kunye neendlela zokuphepha ukuphinda ikhowudi yeentlobo ezahlukeneyo zedatha?

Ukuqonda kakuhle izinto ezivelayo kubalulekile ukuba ube yingcali kulwimi. Ke ukusebenzisa oko ukufundileyo kwesi sifundo kwikhowudi esebenzayo yindlela eya phambili ngoku.