Juda daho odam dunyoni boshqa burchak ostida ko’radi uning hamkasblari


Download 97.37 Kb.
Sana31.03.2023
Hajmi97.37 Kb.
#1313253
Bog'liq
MUSAYEV TARJIMA TAYYOR


Juda daho odam dunyoni boshqa
burchak ostida ko’radi uning hamkasblari.
- Havelok Ellis
Insoniyat-bizning alohida individualligimiz,
bizning umumiyligimizdan ajralib turadi.
- Oliver Vendell Xolms, Sr.
Bir qonun ostida, boshqa qonun ostida tug'ilgan
va bog'langan.
— Lord Bruk
O b j e c t i v e s
Ushbu bo'limda siz quyidagilarni bilib olasiz:

  • Umumiy usullarni yaratish

bir xil vazifalarni bajaradigan
turli argumentlar bo'yicha
turlari.

  • Umumiy Stack yaratish uchun

foydalanish mumkin bo'lgan sinf
har qanday sinf ob'ektlarini saqlash yoki
interfeys turi.

  • Qanday qilishni tushunish uchun

umumiy usullarni ortiqcha yuklash
umumiy bo'lmagan usullar bilan yoki
boshqa umumiy usullar bilan.

  • Xom turlarini tushunish va

erishishga qanday yordam beradilar
orqaga qarab muvofiqlik.

  • Qachon joker belgilardan foydalanish uchun

aniq turdagi ma'lumotlar
parametr haqida emas,
usul tanasida talab qilinadi.

874 21-bob Umumiy sinflar va usullar


21.1 Kirish
Siz 7 va 20-boblarda mavjud umumiy usullar va sinflardan foydalangansiz. Ushbu bobda,o'zingiz yozishni o'rganasiz. Shuningdek, siz generiklar va o'rtasidagi munosabatlarni o'rganasiz haddan tashqari yuklash va merosxo'rlik kabi boshqa java xususiyatlari.Elementlarni saralash uchun bitta tartiblash usulini yozsak yaxshi bo'lardi.Integer massivi, String massivi yoki tartiblashni qo'llab-quvvatlaydigan har qanday turdagi massiv (ya'ni, uning elementlarini solishtirish mumkin). Agar biz bitta Stack sinfini yozsak yaxshi bo'lardi butun sonlar to'plami, suzuvchi nuqtali raqamlar to'plami, satrlar to'plami sifatida foydalanish mumkin, yoki boshqa turdagi steklarda. Turlarning mos kelmasligini aniqlay olsak, yanada yaxshi bo'lardi. Kompilyatsiya vaqti - kompilyatsiya vaqti turi xavfsizligi sifatida tanilgan. Misol uchun, agar Stack faqat saqlasabutun sonlar, Stringni o'sha Stackga surishga urinish kompilyatsiya vaqtida xatolikka olib kelishi kerak. Ushbu bobda umumiy modellarni yaratish vositalarini ta'minlovchi generiklar muhokama qilinadi.yuqorida aytib o'tilgan. Umumiy usullar sizga bitta usul deklaratsiyasi bilan bog'liq usullar to'plamini belgilash imkonini beradi. Umumiy sinflar (va interfeyslar) bilan belgilash imkonini beradi.Shuningdek, generiklar kompilyatsiya vaqtida noto'g'ri turlarni ushlash imkonini beruvchi kompilyatsiya vaqti turi xavfsizligini ta'minlang. Biz ob'ektlar massivini saralashning umumiy usulini yozishimiz va keyin chaqirishimiz mumkin. saralash uchun Integer massivlari, Double massivlar, String massivlari va boshqalar bilan umumiy usul massiv elementlaridir. Kompilyator massiv o'tganligiga ishonch hosil qilish uchun turli tekshiruvni amalga oshirishi mumkin.
Saralash usuli bir xil turdagi elementlarni o'z ichiga oladi. Biz bitta generic yozishimiz mumkin:

  1. Ob'ektlar to'plamini boshqaradigan stack klassi, so'ngra stek uchun Stack ob'ektlarini yarating.

  2. Butun sonlar, Doubles to'plami, satrlar to'plami va boshqalar. Kompilyator bajarishi mumkin edi.

  3. Stack bir xil turdagi elementlarni saqlashiga ishonch hosil qilish uchun turini tekshirish.

21.2 Umumiy usullar uchun motivatsiya:
Haddan tashqari yuklangan usullar ko'pincha har xil turdagi o'xshash operatsiyalarni bajarish uchun ishlatiladi. ma'lumotlar. Umumiy usullarni rag'batlantirish uchun keling, o'z ichiga olgan misol (21.1-rasm) bilan boshlaylik
Stringni chop etuvchi haddan tashqari yuklangan printArray usullari (21–28, 31–38 va 41–48 qatorlar) Integer massivi, Double massivi va Belgilar massivi elementlarining tasvirlari, mos ravishda, int, double va char ibtidoiy tipdagi massivlardan foydalanishimiz mumkin edi.
21.1 Kirish
21.2 Umumiy usullar uchun motivatsiya
21.3 Umumiy usullar: Amalga oshirish
va Compile-time Translation
21.4 Qo'shimcha kompilyatsiya vaqti tarjimasi
Muammolar: Turni ishlatadigan usullar
Qaytish turi sifatida parametr
21.5 Umumiy usullarni ortiqcha yuklash
21.6 Umumiy sinflar
21.7 Xom turlari
21.8 Qabul qilinadigan usullardagi joker belgilari
Parametrlar turi
21.9 Generiklar va meros: Eslatmalar
21.10 Yakunlash.
Xulosa. | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar
Dasturiy ta'minot muhandisligi kuzatuvi 21.1
Umumiy usullar va sinflar Java-ning dasturiy ta'minotni qayta ishlatish uchun eng kuchli imkoniyatlaridan biridir
kompilyatsiya vaqti turi xavfsizligi bilan.
21.2 Umumiy usullar uchun motivatsiya 875
bizning umumiy usul misolimizni o'rnatish uchun type-wrapper sinflarining massivlaridan foydalanish, chunki faqat
mos yozuvlar turlari umumiy usullar va sinflar bilan ishlatilishi mumkin.
1 // 21.1-rasm: OverloadedMethods.java
2 // Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish.
3 Ommaviy sinf OverloadedMethods
4 {
5 umumiy statik bekor asosiy (String [] args)
6 {
7 // Integer, Double va Character massivlarini yarating
8 Integer [] integerArray = {1, 2, 3, 4, 5, 6};
9 Double [] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
10 Belgi [] characterArray = {'H', 'E', 'L', 'L', 'O’};
11
12 System.out.println("IntegerArray massivida:");
13 printArray( integerArray ) ;// pass an integer array
14 System.out.println("\nDoubleArray massivida:");
15 print Array (doubleArray); pass a Double array
16 System.out.println("\nMassiv characterArray tarkibida:");
17 printArray( characterArray ); pass a Character array
18} // asosiyni tugatish
19
20 // Integer massivini chop etish uchun printArray usuli
21 public static void printArray(Integer[] inputArray )
22 {
23 // massiv elementlarini ko'rsatish
24 uchun (Integer element: inputArray)
25 System.out.printf("%s", element);
26
27 System.out.println();
28} // end usuli printArray
29
30 // Chop etish uchun printArray usuli Double massiv
31 public static void printArray(Double[] inputArray)
32 {
33 // massiv elementlarini ko'rsatish
34 uchun (Ikki element: inputArray)
36
37 System.out.println();
} // end usuli printArray
39
40 // Belgilar massivini chop etish uchun printArray usuli
41
42 {
43 // massiv elementlarini ko'rsatish
44 uchun (Belgi elementi: inputArray)
45 System.out.printf("%s", element);
46
47 System.out.println();
48} // end usuli printArray
49} // oxirgi sinf OverloadedMethods
21.1-rasm | Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish. (2-qismning 1-qismi.)
printArray (integerArray); // Integer massivini o'tkazing
printArray(doubleArray ); // Double massivni o'tkazing
printArray(characterArray); // Belgilar massivini o'tkazish
umumiy statik void printArray(Integer[] inputArray )
umumiy statik void printArray (Double [] inputArray)
umumiy statik void printArray(Character [] inputArray )
876 21-bob Umumiy sinflar va usullar.
Dastur uchta massivni e'lon qilish va ishga tushirish bilan boshlanadi - olti elementli Integer massiv integerArray (8-qator), etti elementli Double array doubleArray (9-qator) va besh elementli Belgilar massivi characterArray (10-qator). Keyin 12-17 qatorlar har bir massivning mazmunini ko'rsatadi. Kompilyator usul chaqiruviga duch kelganda, u qo'ng'iroqdagi argument turlariga mos keladigan bir xil nom va parametrlarga ega usul deklaratsiyasini topishga harakat qiladi. Bunda masalan, har bir printArray chaqiruvi printArray usuli deklaratsiyasidan biriga mos keladi. Uchun masalan, 13-qator argument sifatida printArray-ni integerArray bilan chaqiradi. Kompilyator argument turini aniqlaydi (ya'ni,Integer[]) va printArrayni topishga harakat qiladi.Integer[] parametrini belgilaydigan usul (21–28-qatorlar), so‘ngra unga qo‘ng‘iroqni o‘rnatadi. Xuddi shunday, kompilyator 15-qatorda qo'ng'iroqqa duch kelganida, u aniqlaydi. Argument turini (masalan,Double[]), keyin Double[] parametrini (31–38-qatorlar) belgilaydigan printArray usulini topishga harakat qiladi, so‘ngra ushbu usulga qo‘ng‘iroqni o‘rnatadi. Nihoyat, kompilyator 17-qatorda qo'ng'iroqqa duch keladi, u argument turini aniqlaydi (ya'niCharacter[]), so'ngra Character[] ni belgilaydigan printArray usulini topishga harakat qiladi. Parametr (41–48-qatorlar), keyin ushbu usulga qo'ng'iroqni o'rnatadi. Har bir printArray usulini o'rganing. Massiv elementi turi har bir usulda ko'rinadi. Sarlavha (21, 31 va 41-satrlar) va for-statement sarlavhasi (24, 34 va 44-qatorlar). Agar biz har bir usuldagi element turlarini umumiy nom bilan almashtiring - konventsiya bo'yicha – keyin bo’lsak,
uch usul ham 21.2-rasmdagiga o'xshaydi. Ko'rinib turibdiki, agar biz uni almashtira olsak massiv elementi turi uchta usulning har birida bitta umumiy turga ega bo'lsa, bizning String tasvirlarini aks ettira oladigan bitta printArray usulini e'lon qila olish ob'ektlarni o'z ichiga olgan har qanday massivning elementlari. 21.2-rasmdagi usul shunga o'xshash umumiy printArray usuli deklaratsiyasini biz 21.3-bo'limda muhokama qilamiz. IntegerArray massivi quyidagilarni o'z ichiga oladi:
1 2 3 4 5 6
DoubleArray massivi quyidagilarni o'z ichiga oladi:
1,1 2,2 3,3 4,4 5,5 6,6 7,7
characterArray massivi quyidagilarni o'z ichiga oladi:
SALOM
1 ommaviy statik bekor printArray([] inputArray )
2 {
3 // massiv elementlarini ko'rsatish
4 uchun (element: inputArray)
5 System.out.printf("%s", element);
67
System.out.println();
8} // end usuli printArray
21.2-rasm | printArray usuli, bunda haqiqiy tur nomlari konventsiya bilan almashtiriladi
umumiy ism T.
21.1-rasm | Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish. (2-qismning 2-qismi.)
T
T
21.3 Umumiy usullar: Amalga oshirish va kompilyatsiya vaqti tarjimasi 877
21.3 Umumiy usullar: Amalga oshirish va CompileTime tarjimasi:
Agar bir nechta ortiqcha yuklangan usullar bilan bajarilgan operatsiyalar har bir argument uchun bir xil bo'lsa turi, haddan tashqari yuklangan usullar a yordamida ixchamroq va qulayroq kodlanishi mumkin. Umumiy usul: Siz chaqirish mumkin bo'lgan yagona umumiy usul deklaratsiyasini yozishingiz mumkin. Har xil turdagi argumentlar,umumiy argumentlarga o'tgan argumentlar turlari asosidagi usuli bo'lsa, kompilyator har bir usul chaqiruvini mos ravishda boshqaradi.
21.3-rasmda umumiy printArray yordamida 21.1-rasm qo'llanilishi ko'rsatilgan.
usuli (22–29-qatorlar). 14, 16 va 18-qatorlardagi printArray usuli chaqiruvlari bir xil
21.1-rasmdagilarga (14, 16 va 18-qatorlar) va ikkita dasturning natijalari bir xil. Bu generiklarning ifodali kuchini keskin ko'rsatadi.
1 // 21.3-rasm: GenericMethodTest.java
2 // PrintArray umumiy usuli yordamida massiv elementlarini chop etish. 34
umumiy sinf GenericMethodTest
5 {
6 umumiy statik bekor asosiy (String [] args)
7 {
8 // Integer, Double va Character massivlarini yarating
9 Integer [] intArray = {1, 2, 3, 4, 5};
10 Double [] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
11 Belgi[] charArray = { 'H', 'E', 'L', 'L', 'O' };
12
13 System.out.println("IntegerArray massivida:");
14
15 System.out.println("\nDoubleArray massivi tarkibida:");
16
17 System.out.println("\nMassiv characterArray tarkibida:");
18
19} // asosiyni tugatish
20
21
22
23 {
24
25
26
27
28 System.out.println();
29} // end usuli printArray
30} // yakuniy sinf GenericMethodTest
IntegerArray massivi quyidagilarni o'z ichiga oladi:
1 2 3 4 5 6
DoubleArray massivi quyidagilarni o'z ichiga oladi:
1,1 2,2 3,3 4,4 5,5 6,6 7,7
characterArray massivi quyidagilarni o'z ichiga oladi:
SALOM
21.3-rasm | PrintArray umumiy usuli yordamida massiv elementlarini chop etish.
printArray (integerArray); // Integer massivini o'tkazing
printArray (doubleArray); // Double massivni o'tkazing
printArray (characterArray); // Belgilar massivini o'tkazish
// printArray umumiy usuli
umumiy statik < T > void printArray( T[] inputArray )

// massiv elementlarini ko'rsatish


uchun (T elementi: inputArray)
System.out.printf("%s", element);

878 21-bob Umumiy sinflar va usullar


22-qator printArray deklaratsiyasi usulini boshlaydi. Barcha umumiy usul deklaratsiyasi
dan oldingi burchakli qavslar (< va >) bilan ajratilgan turdagi parametr bo'limiga ega bo'ling. Usulning qaytish turi (bu misolda< T >). Har bir tip-parametr bo'limida bitta yoki ikkita turi mavjud. Ko'proq turdagi parametrlar (rasmiy turdagi parametrlar deb ham ataladi), vergul bilan ajratiladi. Bir parametr, shuningdek, turdagi o'zgaruvchi sifatida ham tanilgan, umumiy tip nomini belgilaydigan identifikatordir. Tur parametrlari umumiy usul deklaratsiyasida qaytarish turini, parametr turlarini va mahalliy o'zgaruvchilar turlarini e'lon qilish uchun ishlatilishi mumkin va ular turlari uchun to'ldiruvchi vazifasini bajaradi. Argumentlar umumiy usulga o'tkaziladi, ular haqiqiy turdagi argumentlar sifatida tanilgan. Umumiy usulning tanasi, boshqa har qanday usul kabi e'lon qilinadi. A tur parametrlari ibtidoiy turlarni emas (masalan, int, double va char) faqat mos yozuvlar turlarini ifodalashi mumkin. Bunga ham e'tibor bering metod deklaratsiyasidagi tip-parametr nomlari tip-parametr bo’limida e'lon qilinganlarga mos kelishi kerak. Masalan, 25-satr elementni T turi sifatida e'lon qiladi, bu esa 22-satrda e'lon qilingan turdagi parametrga (T) mos keladi. Shuningdek, turdagi parametr e'lon qilinishi mumkin. Parametrlar ro'yxati: Masalan, T tipi-parametr nomi quyida ikki marta uchraydi. Usul parametrlari ro'yxati: Tur parametrlari nomlari turli umumiy usullar orasida yagona bo'lishi shart emas. PrintArray usulining tip-parametr bo'limi T tip parametrini printArray chiqaradigan massiv elementi turi uchun joy ushlagichi sifatida e'lon qiladi va parametrda T paydo bo'ladi. Massiv elementi turi sifatida ro'yxat (22-qator). For-bayon sarlavhasi (25-satr) T sifatida ham foydalanadigan element turi. Bu printArray haddan tashqari yuklangan ikkita joy 21.1-rasmdagi usullar massiv elementi turi sifatida Integer, Double yoki Character ko'rsatilgan. PrintArray ning qolgan qismi 21.1-rasmda keltirilgan versiyalar bilan bir xil. b21.1-rasmdagidek, dastur olti elementli Integerni e'lon qilish va ishga tushirishdan boshlanadi. Massiv integerArray (9-qator), yetti elementli Double array doubleArray (10-qator) va besh elementli Belgilar massivi characterArray (11-qator). Keyin dastur har bir massivni chiqaradi. PrintArray ni chaqirish orqali (14, 16 va 18-qatorlar) - bir marta integerArray argumenti bilan, bir marta doubleArray argumenti va bir marta characterArray argumenti bilan. Kompilyator 14-qatorga duch kelganida, u birinchi navbatda integerArray argumentini aniqlaydi. Yozing (ya'ni, Integer []) va printArray nomli usulni aniqlashga harakat qiladi. Keyingi, kompilyator singlni belgilaydigan printArray nomli umumiy usul mavjudligini aniqlaydi. Massiv parametri va massiv elementi turini ifodalash uchun tip parametridan foydalanadi. Kompilyator printArray (22–29-qatorlar) mos kelishini aniqlaydi va usulga qo'ng'iroqni o'rnatadi. Xuddi shu jarayon 16 va 18-qatorlarda printArray usuliga qo'ng'iroqlar uchun takrorlanadi. Umumiy statik < T > void printTwoArrays ( T[] array1, T[] array2 )
Umumiy dasturlash xatosi 21.1
Umumiy usulni e'lon qilishda, usulning qaytish turidan oldin tip-parametr bo'limini joylashtirmaslik sintaksis xatosidir - kompilyator usulda uchraganida tip parametrlari nomlarini tushunmaydi.
Yaxshi dasturlash amaliyoti 21.1
Tur parametrlarini alohida bosh harflar sifatida ko'rsatish tavsiya etiladi. Odatda, massiv elementining turini (yoki boshqa to'plamni) ifodalovchi tip parametri T deb nomlanadi.
21.3 Umumiy usullar: amalga oshirish va kompilyatsiya qilish vaqti Tarjima 879 Usul chaqiruvlarini o'rnatishdan tashqari, kompilyator ham usul tanasidagi operatsiyalar massivda saqlangan turdagi elementlarga qo'llanilishi mumkin. Ushbu misoldagi massiv elementlarida bajariladigan yagona operatsiya va ularning String tasvirini chiqarish. 26-qator har birida yashirin toString chaqiruvini amalga oshiradi. Jeneriklar bilan ishlash uchun massivning har bir elementi sinf yoki interfeys tipidagi obyekt bo'lishi kerak. Barcha ob'ektlar toString usuliga ega bo'lganligi sababli, kompilyator 26-qatorni qondiradi va printArray massivi argumentidagi har qanday ob'ekt uchun haqiqiy amalni bajaradi. Integer, Double va Character sinflarining usullari String tasvirini qaytaradi.
Kompilyatsiya vaqtida o'chirish:
Kompilyator printArray umumiy usulini Java bayt kodlariga tarjima qilganda, u olib tashlaydi tip-parametr bo'limi va tur parametrlarini haqiqiy turlar bilan almashtiradi. Bu jarayon yo'q qilish deb nomlanadi. Odatiy bo'lib, barcha umumiy turlar Ob'ekt turi bilan almashtiriladi. Shunday qilib, printArray usulining kompilyatsiya qilingan versiyasi 21.4-rasmda ko'rsatilganidek paydo bo'ladi - faqat bitta nusxa mavjud misoldagi barcha printArray chaqiruvlari uchun ishlatiladigan ushbu kodning. Bu butunlay boshqacha C++ shablonlari kabi boshqa shunga o'xshash mexanizmlardan, unda alohida nusxasi mavjud manba kodi usulga argument sifatida berilgan har bir tur uchun yaratiladi va kompilyatsiya qilinadi. 21.4-bo'limda ko'rib turganingizdek, generiklarning tarjimasi va kompilyatsiyasi biz ushbu bo'limda muhokama qilgan narsalarga qaraganda bir oz ko'proq ishtirok etadi.
21.3-rasmda printArray ni umumiy usul sifatida e’lon qilib, biz zaruratni bartaraf etdik.
21.1-rasmdagi haddan tashqari yuklangan usullar, 19 qator kodni saqlash va qayta foydalanish mumkin bo'lgan kodni yaratish
obyektlarni o'z ichiga olgan har qanday massivdagi elementlarning String tasvirlarini chiqarishi mumkin bo'lgan usul. Biroq, bu maxsus misol oddiygina printArray ni e'lon qilishi mumkin edi.
21.4-rasmda ko'rsatilganidek usul, parametr sifatida Ob'ekt massividan foydalangan holda. Bu bo'lardi bir xil natijalarni berdi, chunki har qanday Obyektni String sifatida chiqarish mumkin. Umumiy holda usul, foyda, usul shuningdek, turi parametridan foydalanganda ayon bo'ladi, keyingi bo'limda ko'rsatganimizdek, usulning qaytish turi.
Umumiy dasturlash xatosi 21.2
Agar kompilyator usul chaqiruvini umumiy bo'lmagan yoki umumiy usul deklaratsiyasiga moslashtira olmasa, kompilyatsiya xatosi yuzaga keladi.
Umumiy dasturlash xatosi 21.3
Agar kompilyator usul chaqiruviga to'liq mos keladigan usul deklaratsiyasini topmasa, lekin usul chaqiruvini qondira oladigan ikki yoki undan ortiq usullarni topsa, kompilyatsiya xatosi yuzaga keladi.
1 ommaviy statik bekor printArray([] inputArray )
2 {
3 // massiv elementlarini ko'rsatish
4 uchun (element: inputArray)
5 System.out.printf("%s", element);
67
System.out.println();
8} // end usuli printArray
21.4-rasm | O'chirishdan keyin printArray umumiy usuli kompilyator tomonidan amalga oshiriladi.
Obyekt
880 21-bob. Umumiy sinflar va usullar
21.4 Kompilyatsiya vaqtidagi qo'shimcha tarjima muammolari:
Qaytish turi sifatida tur parametridan foydalanadigan usullar Qaytishda turli turdagi parametrlar qo'llaniladigan umumiy usul misolini ko'rib chiqaylik yozing va parametrlar ro'yxatida (21.5-rasm). Ilova maksimal umumiy usuldan foydalanadi bir xil turdagi uchta argumentdan eng kattasini aniqlash va qaytarish. Afsuski, relyatsion operator > mos yozuvlar turlari bilan ishlatilmaydi. Shu bilan birga, agar ushbu sinf Comparable (java.lang paketi) umumiy interfeysini amalga oshirsa, bir sinfning ikkita ob'ektini solishtirish mumkin. Ibtidoiy turlar uchun barcha turdagi o'rash sinflari amalga oshiriladi. Umumiy sinflar singari, umumiy interfeyslar ham bitta bilan belgilash imkonini beradigan interfeys deklaratsiyasi, tegishli turlar to'plami. Comparable ob'ektlari solishtirmaga ega usuli. Misol uchun, agar bizda ikkita Integer ob'ekti bo'lsa, integer1 va integer2, ular mumkin ifoda bilan solishtiriladi:
Comparable ni amalga oshiradigan sinfni o'sha sinfning ikkita ob'ekti mazmunini solishtirish va taqqoslash natijalarini qaytarish uchun solishtirish usulini e'lon qilish uchun sizning javobgarligingiz. Comparable interfeysi hujjatlarida ko'rsatilganidek, compareTo kerak agar ob'ektlar teng bo'lsa, 0 ni, agar ob'ekt1 ob'ekt2 dan kichik bo'lsa, manfiy butun sonni yoki ob'ekt1 ob'ekt2 dan katta bo'lsa, musbat butun sonni qaytaring. Masalan, Integer klassi solishtirish usuli ikkita Integer obyektida saqlangan int qiymatlarini solishtiradi. Amalga oshirishning foydasi Comparable interfeysi - Comparable ob'ektlarini saralash va bilan ishlatish mumkin.
To'plamlar sinfini qidirish usullari (java.util paketi). Biz bu usullarni 20-bobda muhokama qildik. Bu misolda maksimal to usulida solishtirish usulidan foydalanamiz.
integer1.compareTo(integer2)
1 // 21.5-rasm: MaximumTest.java
2 // Umumiy usul maksimal uchta obyektning eng kattasini qaytaradi.
34
ommaviy sinf MaximumTest
5 {
6 ta umumiy statik bekor asosiy (String [] args)
7 {
8 System.out.printf("Maksimal %d, %d va %d - %d\n\n", 3, 4, 5, 9);
10 System.out.printf("Maksimal %.1f, %.1f va %.1f - %.1f\n\n",
11 6.6, 8.8, 7.7,);
12 System.out.printf("%s, %s va %s ning maksimal soni %s\n", "nok",
13 "olma", "apelsin",);
14} // asosiyni tugatish
15
16
17
18
19
20
21
22
21.5-rasm | Umumiy usul maksimal, uning turi parametrining yuqori chegarasi. (2-qismning 1-qismi.)
maksimal (3, 4, 5)
maksimal (6,6, 8,8, 7,7)
maksimal ("nok", "olma", "apelsin")
// uchta taqqoslanadigan ob'ektning eng kattasini aniqlaydi
umumiy statik < T kengaytiriladi solishtiriladigan< T > > T maksimal (T x, T y, T z)
{
T max = x; // faraz qilaylik, x dastlab eng katta
agar (y.qiyoslash( maks ) > 0 )
max = y; // y hozirgacha eng kattasi

21.4 Tur parametrini 881 turini qaytarish sifatida ishlatadigan usullar


Umumiy usul maksimal
Maksimal umumiy usul (17–28-qatorlar) qaytish turi sifatida T turi parametridan foydalanadi
usul (17-satr), usul parametrlari x, y va z (17-qator) va turi sifatida
mahalliy o'zgaruvchining max (19-qator). Type-parameter bo'limi T ning Comparable-ni kengaytirishini bildiradi — faqat Comparable interfeysini amalga oshiradigan sinflar ob'ektlaridan foydalanish mumkin bu usul bilan. Bunday holda, Comparable turi parametrning yuqori chegarasi sifatida tanilgan. Odatiy bo'lib, Ob'ekt yuqori chegara hisoblanadi. Bog'langan turdagi parametr deklaratsiyasi parametr turi parametri sinfni kengaytiradimi yoki interfeysni amalga oshiradimi, har doim kengaytirilgan kalit so'zni ishlatadi. Ushbu turdagi parametrdan ko'ra ko'proq cheklangan.
21.3-rasmda printArray uchun belgilangan, u har qanday tarkibni o'z ichiga olgan massivlarni chiqarishga qodir edi. ob'ekt turi. Comparable obyektlaridan foydalanishni cheklash muhim, chunki bunday emas barcha ob'ektlarni solishtirish mumkin. Shu bilan birga, Comparable obyektlari a bo'lishi kafolatlanadi Maksimal usul aniqlash uchun biz 6.4-bo'limda ishlatgan algoritmdan foydalanadi uchta argumentning eng kattasi. Usul uning birinchi argumenti (x) ni nazarda tutadi. Keyinchalik, 21-22 qatorlardagi if ifodasi y ning max dan katta ekanligini aniqlaydi. Shart y ning compareTo usulini chaqiradi. y.compareTo(max) ifodasi bilan manfiy butun son, 0 yoki musbat qaytaradi butun son, y ning maksga bo'lgan munosabatini aniqlash uchun. Agar compareTo ning qaytish qiymati kattaroq bo'lsa 0 dan katta bo'lsa, y kattaroq va max o'zgaruvchisiga tayinlanadi. Xuddi shunday, satrlardagi if ifodasi 24–25 z ning maks.dan katta ekanligini aniqlaydi. Agar shunday bo'lsa, 25-qator z ni max ga belgilaydi. Keyin chiziq 27 qo'ng'iroq qiluvchiga maksimal qaytaradi.
Qo'ng'iroq qilish usuli maksimal
Asosiy (6–14-qatorlar) 9-qatorda 3, 4 va 5 butun sonlar bilan maksimal chaqiriladi. Kompilyator qachon ushbu chaqiruvga duch kelganda, u birinchi navbatda uchta turdagi argumentni oladigan maksimal usulni qidiradi. int Bunday usul yo'q, shuning uchun kompilyator foydalanish mumkin bo'lgan umumiy usulni qidiradi va maksimal umumiy usulni topadi. Biroq, esda tutingki, umumiy usulga argumentlar mos yozuvlar turi bo'lishi kerak. Shunday qilib, kompilyator uchta int qiymatini Integer sifatida avtomatik qutiga qo'yadi. Obyektlar va uchta Integer obyekti maksimal darajaga o'tkazilishini bildiradi. Class Integer (java.lang paketi) Comparable interfeysini amalga oshiradi, shunday qilib compareTo usuli ikkita Integer obyektidagi int qiymatlarini solishtiradi. Shuning uchun butun sonlar maksimal usul uchun haqiqiy argumentlar. Maksimalni ifodalovchi butun son qayta tiklanganda
23
2425
26
27
28
29} // oxirgi sinf MaximumTest
Maksimal 3, 4 va 5 - 5
6,6, 8,8 va 7,7 maksimal 8,8 ni tashkil qiladi
Armut, olma va apelsinning maksimali nokdir
21.5-rasm | Umumiy usul maksimal, uning turi parametrining yuqori chegarasi. (2-qismning 2-qismi.)
agar (z.compareTo( max ) > 0 )
max = z; // z eng kattasi
maksimal qaytish; // eng katta ob'ektni qaytaradi
} // tugatish usuli maksimal
21-bob Umumiy sinflar va usullar burilsa, biz uni int ibtidoiy tipdagi qiymatni chiqaradigan %d format spetsifikatsiyasi bilan chiqarishga harakat qilamiz. Shunday qilib, maksimalning qaytish qiymati int qiymati sifatida chiqariladi. Shunga o'xshash jarayon 11-qatorda maksimal darajaga o'tkazilgan uchta qo'sh argument uchun sodir bo'ladi. Har bir dubl Double ob'ekt sifatida autoboxed qilinadi va maksimal darajaga o'tkaziladi. Shunga qaramay, bunga ruxsat beriladi chunki Double klassi (java.lang paketi) Comparable interfeysini amalga oshiradi. Maksimal qaytarilgan Double %.1f format aniqlagich bilan chiqariladi, u chiqadi ikkilamchi primitiv turdagi qiymat. Shunday qilib, maksimalning qaytish qiymati avtomatik ravishda ochiladi va a sifatida chiqariladi.
13-qatordagi maksimalga qo'ng'iroq uchta Stringni oladi, ular ham Comparable obyektlaridir. Biz ataylab eng katta qiymatni boshqa pozitsiyaga joylashtirdik har bir usul chaqiruvi (9, 11 va 13-qatorlar) umumiy usul har doim topilganligini ko'rsatish uchun. Kompilyator maksimal usulni bayt-kodlarga tarjima qilganda, u o'chirishdan foydalanadi (bu erda kiritilgan).
21.3-bo'lim) turdagi parametrlarni haqiqiy turlarga almashtirish. 21.3-rasmda barcha umumiy turlar mavjud. Ob'ekt turi bilan almashtirildi. Aslida, barcha turdagi parametrlar deb ataladigan bilan almashtiriladi. Yuqori chegarani ko'rsatish uchun type parametri nomini kengaytirilgan va kalit so'zi bilan kuzatib boring yuqori chegarani ifodalovchi sinf yoki interfeys nomi yoki vergul bilan ajratilgan roʻyxati
yuqori chegarani ifodalovchi turlar. Ro'yxatda nol yoki bitta sinf va nol yoki undan ko'p bo'lishi mumkin. Masalan, maksimal usulning tip-parametr bo'limida (21.5-rasm) biz T tipi parametrining yuqori chegarasini Comparable turi sifatida quyidagicha belgilab oldik: Shunday qilib, faqat Comparable ob'ektlari argument sifatida maksimal darajaga o'tkazilishi mumkin - har qanday narsa solishtirish mumkin emas kompilyatsiya xatolariga olib keladi. Agar boshqacha belgilanmagan bo'lsa, Obyekt standart yuqori chegara hisoblanadi. 21.6-rasmda maksimal usulning o'chirilishi simulyatsiya qilingan tip-parametr bo'limi olib tashlanganidan keyin usulning manba kodini ko'rsatish orqali turlari va parametr T turi yuqori chegarasi bilan almashtiriladi, solishtirma, bo'ylab usul deklaratsiyasi bo’ladi. Comparable ning o'chirilishi shunchaki solishtirish mumkin. O'chirishdan so'ng, maksimal usul uning solishtiriladigan turini qaytarishini bildiradi. Biroq, qo'ng'iroq qilish usuli solishtirma qabul qilishni kutmaydi. U obyektni olishni kutadi va argument sifatida maksimalga uzatilgan bir xil turdagi - Integer, Double yoki String
T taqqoslanadigan< T > kengaytiriladi
1 umumiy statik maksimal (x, y, z)
2 {
3max = x; // faraz qilaylik, x dastlab eng katta
45
agar (y.qiyoslash( maks ) > 0 )
6max = y; // y hozirgacha eng kattasi
78
agar (z.compareTo( max ) > 0 )
9max = z; // z eng kattasi
10
Maksimal qaytish 11; // eng katta ob'ektni qaytaradi
12} // tugatish usuli maksimal
21.6-rasm | O'chirishdan keyin maksimal umumiy usul kompilyator tomonidan amalga oshiriladi.
21.5 Umumiy usullarni haddan tashqari yuklash 883
bu misolda. Kompilyator tip-parametr ma'lumotlarini bilan almashtirganda taqqoslash mumkin. Usul deklaratsiyasida yuqori chegara turi, shuningdek, oldinga aniq cast operatsiyalarini kiritadi. Qaytarilgan qiymat qo'ng'iroq qiluvchi tomonidan kutilgan turdagi bo'lishini ta'minlash uchun har bir usul chaqiruvi. Shunday qilib, 9-qatorda (21.5-rasm) maksimalga qo'ng'iroq qilishdan oldin Integer cast bo'ladi, xuddi quyidagi kabi.
11-qatordagi maksimalga qo'ng'iroqdan oldin, quyidagi kabi Double cast bilan amalga oshiriladi va 13-qatordagi maksimalga qo'ng'iroqdan oldin, quyidagi kabi String cast bilan amalga oshiriladi. Har bir holatda, qaytariladigan qiymat uchun quyma turi ma'lum bir usul chaqiruvidagi usul argumentlarining turlaridan kelib chiqadi, chunki usul deklaratsiyasiga ko'ra, qaytish turi va argument turlari mos keladi. Mumkin bo'lgan ClassCast istisnolari Ushbu misolda siz Ob'ektlarni qabul qiladigan usuldan foydalana olmaysiz, chunki Object klassi faqat tenglikni taqqoslashni ta'minlaydi. Bundan tashqari, generiklarsiz siz cast operatsiyasini amalga oshirish uchun javobgar bo'lasiz. Jeneriklardan foydalanish kiritilgan gips hech qachon tashlanmasligini ta'minlaydi.
ClassCastException, agar generiklar sizning kodingiz davomida qo'llaniladi (ya'ni, siz
eski kodni yangi umumiy kod bilan aralashtirmang).
21.5 Umumiy usullarni ortiqcha yuklash
Umumiy usul haddan tashqari yuklangan bo'lishi mumkin. Sinf ikki yoki undan ortiq umumiy usullarni taqdim etishi mumkin
bir xil usul nomini, lekin boshqa usul parametrlarini belgilang. Masalan, umumiy
21.3-rasmdagi printArray usuli boshqa printArray generic bilan ortiqcha yuklanishi mumkin
ni belgilash uchun lowSubscript va highSubscript qo'shimcha parametrlari bilan usul massivning chiqish qismi (21.5-mashqga qarang).
Umumiy usulni umumiy bo'lmagan usullar bilan ham ortiqcha yuklash mumkin. Qachon kompilyator
usul chaqiruviga duch kelsa, u eng aniq usul deklaratsiyasini qidiradi
qo'ng'iroqda ko'rsatilgan usul nomi va argument turlariga mos keladi. Masalan,
21.3-rasmdagi printArray umumiy usuli maxsus versiya bilan haddan tashqari yuklanishi mumkin
Strings ga, u Stringlarni toza, jadvalli formatda chiqaradi (21.6-mashqga qarang).
Kompilyator usul chaqiruviga duch kelganda, qaysi usulni chaqirish kerakligini aniqlash uchun mos keladigan jarayonni amalga oshiradi. Kompilyator aniq moslikni topishga va undan foydalanishga harakat qiladi
usul nomi va usul chaqiruvining argument turlari ma'lum bir usulnikiga mos keladi
deklaratsiya. Agar bunday usul bo'lmasa, kompilyator mos turlar yoki mos keladigan umumiy usul bilan usulni topishga harakat qiladi.
21.6 Umumiy sinflar
Stack kabi ma'lumotlar strukturasi tushunchasini mustaqil ravishda tushunish mumkin u boshqaradigan element turi. Umumiy sinflar tushunchasini tavsiflash uchun vositani taqdim etadi,stek (yoki boshqa har qanday sinf) turiga bog'liq bo'lmagan tarzda. Keyin biz umumiy sinfning o'ziga xos turlarini yaratishimiz mumkin. Bu qobiliyat ajoyib imkoniyat yaratadi dasturiy ta'minotni qayta ishlatish imkoniyati.
(Butun) maksimal (3, 4, 5)
(Ikki marta) maksimal (6,6, 8,8, 7,7)
(String) maksimal ("nok", "olma", "apelsin")
884 21-bob Umumiy sinflar va usullar
Umumiy sinfga ega bo'lganingizdan so'ng, uni ko'rsatish uchun oddiy, ixcham belgidan foydalanishingiz mumkin. Sinf turi parametrlar o‘rniga ishlatilishi kerak bo‘lgan turlar Kompilyatsiya vaqtida, kompilyator kodingiz turi xavfsizligini ta'minlaydi va tasvirlangan o'chirish usullaridan foydalanadi.
21.3–21.4 bo'limlarida mijoz kodingizni umumiy sinf bilan o'zaro ta'sir qilish imkonini beradi. Masalan, bitta umumiy Stack klassi ko'plab mantiqiy narsalarni yaratish uchun asos bo'lishi mumkin. Stack sinflari (masalan, “Stack of Double”, “Stack of Integer”, “Stack of characters”, “Stack”
Xodimlar"). Bu sinflar parametrlashtirilgan sinflar yoki parametrlashtirilgan turlar deb nomlanadi
chunki ular bir yoki bir nechta turdagi parametrlarni qabul qiladi. Esda tutingki, bu turdagi parametrlar
faqat mos yozuvlar turlari, ya'ni Stack umumiy sinfini ibtidoiy turlar bilan o'rnatib bo'lmaydi. Biroq, biz Java-ning o'ramidagi ob'ektlarni saqlaydigan Stackni yaratishimiz mumkin
sinflar va Java-ga ibtidoiy qiymatlarni ob'ektlarga aylantirish uchun autoboxingdan foydalanishga ruxsat bering. Eslab qoling
avtobokslash ibtidoiy turdagi qiymat (masalan, int) stekga surilganda sodir bo'ladi.
o'rash sinfidagi ob'ektlarni o'z ichiga oladi (masalan, Integer). Avtomatik qutidan chiqarish ob'ekt qachon sodir bo'ladi
o'rash sinfining bir qismi Stackdan chiqariladi va ibtidoiy turdagi o'zgaruvchiga tayinlanadi.
Umumiy stack sinfini amalga oshirish
21.7-rasmda umumiy Stack klassi deklaratsiyasi keltirilgan. Umumiy sinf deklaratsiyasi o'xshaydi
umumiy bo'lmagan, lekin sinf nomidan keyin tip-parametr bo'limi (5-qator) keladi. Bunda
T tipi parametri Stack boshqaradigan element turini ifodalaydi. Umumiy usullarda bo'lgani kabi, umumiy sinfning tip-parametr bo'limida vergul bilan ajratilgan bir yoki bir nechta turdagi parametrlar bo'lishi mumkin. (Siz ikkita turdagi parametrlarga ega umumiy sinf yaratasiz
21.8-mashq.) Tip parametri T element turini ifodalash uchun Stack klassi deklaratsiyasida ishlatiladi. Ushbu misol Stackni ArrayList sifatida amalga oshiradi.
1 // 21.7-rasm: Stack.java
2 // Stack umumiy sinf deklaratsiyasi.
3 import java.util.ArrayList;
45
umumiy sinf Stack< T >
6 {
789
// argumentsiz konstruktor standart o'lchamdagi stek yaratadi
10 ta umumiy stack()
11 {
12 bu( 10 ); // standart stek hajmi
13 } // end no-argument Stack konstruktori
14
15 // konstruktor belgilangan miqdordagi elementlardan iborat stekni yaratadi
16 ommaviy stek (ichki sig'im)
17 {
18 int initCapacity = sig'im> 0? sig'imi: 10; // tasdiqlang
19
20 } // end bir argumentli Stack konstruktori
21
22 // elementni stekga suring
23
24 {
21.7-rasm | Stack umumiy sinf deklaratsiyasi. (2-qismning 1-qismi.)
xususiy ArrayList< T > elementlari; // ArrayList stek elementlarini saqlaydi
elementlar = yangi ArrayList< T >(initCapacity); // ArrayList yarating
public void push (T pushValue)
21.6 Umumiy sinflar 885
Class Stack o'zgaruvchi elementlarni ArrayList sifatida e'lon qiladi (7-qator). Ushbu ArrayList
Stack elementlarini saqlaydi. Ma'lumki, ArrayList dinamik ravishda o'sishi mumkin
Stack sinfimiz ob'ektlari ham dinamik ravishda o'sishi mumkin. Stack sinfining argumentsiz konstruktori (10-13-qatorlar) bitta argumentli konstruktorni (16-20-qatorlar) yaratish uchun chaqiradi.
Asosiy ArrayList 10 ta element sig'imiga ega bo'lgan stek. Bitta argumentli konstruktorni to'g'ridan-to'g'ri chaqirish ham mumkin, bu ko'rsatilgan bosh harf bilan Stack yaratish
sig'im. 18-qator konstruktor argumentini tasdiqlaydi. 19-qator ArrayList ni yaratadi
belgilangan quvvat (yoki sig'im yaroqsiz bo'lsa 10).
Push usuli (23–26-qatorlar) surilgan elementni qo'shish uchun ArrayList qo'shish usulidan foydalanadi
ArrayList elementlarining oxirigacha. ArrayListdagi oxirgi element ni ifodalaydi
to'plamning yuqori qismi.
Pop usuli (29-36-qatorlar) birinchi dete pop qilishga urinish qilinyaptimi
bo'sh stackdagi element. Agar shunday bo'lsa, 32-qator EmptyStackException ni chiqaradi (e'lon qilingan
21.8-rasmda). Aks holda, 35-qator oxirgi elementni olib tashlash orqali Stackning yuqori elementini qaytaradi
asosiy ArrayListdagi element.
EmptyStackException klassi (21.8-rasm) argumentsiz konstruktorni va
bir argumentli konstruktor. Argumentsiz konstruktor standart xato xabarini o'rnatadi,
va bitta argumentli konstruktor maxsus xato xabarini o'rnatadi.
25
26 } // tugatish usuli surish
27
28 // agar bo'sh bo'lmasa, yuqori elementni qaytaring; boshqa EmptyStackException ni tashlang
29 ommaviy T pop()
30 {
31 if ( elements.isEmpty() ) // agar stek bo'sh bo'lsa
32 yangi EmptyStackException ("Stack bo'sh, ochilib bo'lmaydi");
33
34 // Stackning yuqori elementini olib tashlang va qaytaring
35 qaytarish elements.remove( elements.size() - 1 );
36 } // tugatish usuli pop
37 } // oxirgi sinf Stack< T >
1 // 21.8-rasm: EmptyStackException.java
2 // EmptyStackException sinf deklaratsiyasi.
3 umumiy sinf EmptyStackException RuntimeException-ni kengaytiradi
4 {
5 // argumentsiz konstruktor
6 ommaviy EmptyStackException()
7 {
8 this("Stack bo'sh" );
9 } // argumentsiz tugatish EmptyStackException konstruktori
10
11 // bitta argumentli konstruktor
12 ommaviy EmptyStackException (String xabari)
13 {
21.8-rasm | EmptyStackException sinf deklaratsiyasi. (2-qismning 1-qismi.)
21.7-rasm | Stack umumiy sinf deklaratsiyasi. (2-qismning 2-qismi.)
elements.add( pushValue ); // pushValue-ni Stack-ga joylashtiring
886 21-bob Umumiy sinflar va usullar
Umumiy usullarda bo'lgani kabi, umumiy sinf kompilyatsiya qilinganda, kompilyator sinf turi parametrlarida o'chirishni amalga oshiradi va ularni yuqori chegaralari bilan almashtiradi. Sinf uchun
Stack (21.7-rasm), yuqori chegara belgilanmagan, shuning uchun standart yuqori chegara Ob'ekt hisoblanadi.
ishlatilgan. Umumiy sinf turi parametrining doirasi butun sinfdir. Biroq, yozing
parametrlarni sinfning statik o'zgaruvchilar deklaratsiyasida ishlatib bo'lmaydi.
21.7-rasmdagi umumiy stek sinfini sinovdan o'tkazish
Endi, Stack umumiy sinfidan foydalanadigan dasturni (21.9-rasm) ko'rib chiqamiz (21.7-rasm).
12–13 qatorlar Stack tipidagi o'zgaruvchilarni yaratadi va ishga tushiradi ("Stack of" deb o'qiladi.
Double”) va Stack (“Stack of Integer” deb talaffuz qilinadi). Turlari Double va
Butun sonlar Stack tipidagi argumentlar sifatida tanilgan. Kompilyator ularni almashtirish uchun ishlatadi
turini tekshirishni amalga oshirishi va kerak bo'lganda translyatsiya operatsiyalarini kiritishi uchun parametrlarni kiriting. Tez orada quyma operatsiyalarni batafsil muhokama qilamiz. 12–13 qatorlar sig'imi 5 bo'lgan doubleStack va 10 sig'imli integerStack (standart) ni yaratadi. Chiziqlar
16–17 va 20–21 qoʻngʻiroq usullari testPushDouble (25–36-qatorlar), testPopDouble (39–qatorlar)
59), testPushInteger (62–73-qatorlar) va testPopInteger (76–96-qatorlar) mos ravishda
Ushbu misolda ikkita Stackni ko'rsating.
14 super(xabar);
15 } // bitta argumentli EmptyStackException konstruktorini tugatish
16 } // oxirgi sinf EmptyStackException
1 // 21.9-rasm: StackTest.java
2 // Stack umumiy sinf test dasturi.
34
umumiy sinf StackTest
5 {
6 ta umumiy statik bekor asosiy ( String [] args )
7 {
8 ta double[] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
9 int[] integerElements = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
10
11
12
13
14
15 // doubleElements elementlarini doubleStack-ga suring
16 testPushDouble( doubleStack, doubleElements ); 17 testPopDouble( doubleStack ); // doubleStack-dan oching
18
19 // integerElements elementlarini integerStack-ga surish
20 testPushInteger( integerStack, integerElements );
21 testPopInteger( integerStack ); // integerStack dan ochiladi
22 } // asosiyni tugatish
23
21.9-rasm | Stack umumiy sinf sinov dasturi. (3-qismning 1-qismi.)
21.8-rasm | EmptyStackException sinf deklaratsiyasi. (2-qismning 2-qismi.)
// Stack< Double > va Stack< Integer > yarating
Stack< Double > doubleStack = new Stack< Double >( 5 );
Stack< Integer > integerStack = new Stack< Integer >();

21.6 Umumiy sinflar 887


24 // juft stek bilan surish usulini sinab ko'ring
25 ta shaxsiy statik bekor testPushDouble(
26 Stack< Double > stack, double[] qiymatlari )
27 {
28 System.out.println( "\nElementlarni doubleStack-ga surish" );
29
30 // elementlarni Stackga suring
31 uchun (ikkita qiymat: qiymatlar)
32 {
33 System.out.printf( "%.1f ", qiymat );
34
35 } // uchun tugatish
36 } // testPushDouble tugatish usuli
37
38 // ikkita stek bilan pop usulini sinab ko'ring
39 shaxsiy statik bekor testPopDouble (Stack< Double > stack )
40 {
41 // stekdan ochilgan elementlar
42 urinib ko'ring
43 {
44 System.out.println( "\nDoubleStackdan elementlarni ochish" );
45 ikki barobar popValue; // stekdan olib tashlangan elementni saqlash
46
47 // Stackdan barcha elementlarni olib tashlang
48 vaqt (to'g'ri)
49 {
50
51 System.out.printf( "%.1f ", popValue );
52 } // tugash vaqti
53 } // urinishni tugatish
54 catch (EmptyStackException emptyStackException)
55 {
56 System.err.println();
57 emptyStackException.printStackTrace();
58 } // end catch EmptyStackException
59 } // testPopDouble tugatish usuli
60
61 // butun sonlar to'plami bilan surish usulini sinab ko'ring
62 shaxsiy statik bekor testPushInteger(
63 Stack< Integer > stack, int[] qiymatlari )
64 {
65 System.out.println( "\nElementlarni integerStack-ga surish" );
66
67 // elementlarni Stackga surish
68 uchun ( int qiymati : qiymatlar )
69 {
70 System.out.printf( "%d", qiymat );
71
72 } // uchun tugatish
73 } // tugatish usuli testPushInteger
74
21.9-rasm | Stack umumiy sinf sinov dasturi. (3 qismning 2-qismi.)
stack.push (qiymat); // doubleStack-ga suring
popValue = stack.pop(); // doubleStack-dan oching
stack.push (qiymat); // integerStack-ga suring
888 21-bob Umumiy sinflar va usullar
testPushDouble va testPopDouble usullari
testPushDouble usuli (25–36-qatorlar) juftlikni joylashtirish uchun push usulini (34-qator) chaqiradi.
doubleElements massividan doubleStack-ga 1.1, 2.2, 3.3, 4.4 va 5.5 qiymatlari. Avtobokslash 34-qatorda dastur ibtidoiy ikki tomonlama qiymatni bosishga harakat qilganda sodir bo'ladi
doubleStack, bu faqat Double ob'ektlariga havolalarni saqlaydi.
testPopDouble usuli (39–59-qatorlar) barcha qiymatlarni stekdan olib tashlash uchun cheksiz while tsiklida (48–52-qatorlar) Stack usuli pop (50-qator) ni chaqiradi. Chiqishda eslatma
qiymatlar haqiqatan ham oxirgi kelgan, birinchi chiquvchi tartibda paydo bo'ladi (belgilovchi xususiyat
staklar). Loop oltinchi qiymatni ochishga harakat qilganda, doubleStack bo'sh, shuning uchun pop
75 // butun sonli stek bilan pop usulini sinab ko'ring76 shaxsiy statik bekor testPopInteger( Stack< Integer > stack )
77 {
78 // stekdan ochilgan elementlar
79 urinib ko'ring
80 {
81 System.out.println( "\nIntegerStack dan elementlarni ochish" );
82 int popValue; // stekdan olib tashlangan elementni saqlash
83
84 // Stackdan barcha elementlarni olib tashlang
85 vaqt (to'g'ri)
86 {
87
88 System.out.printf( "%d", popValue );
89 } // tugash vaqti
90 } // urinishni yakunlang
91 catch (EmptyStackException emptyStackException)
92 {
93 System.err.println();
94 emptyStackException.printStackTrace();
95 } // end catch EmptyStackException
96 } // testPopInteger tugatish usuli
97 } // oxirgi sinf StackTest
Elementlarni doubleStack-ga surish
1,1 2,2 3,3 4,4 5,5
DoubleStack-dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest.testPopDouble da (StackTest.java:50)
StackTest.main da (StackTest.java: 17)
IntegerStack-ga elementlarni surish
1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest.testPopInteger da (StackTest.java:87)
StackTest.main da (StackTest.java: 21)
21.9-rasm | Stack umumiy sinf sinov dasturi. (3 qismning 3-qismi.)
popValue = stack.pop(); // intStack-dan oching
21.6 Umumiy sinflar 889
EmptyStackException ni chiqaradi, bu dasturning catch blokiga o'tishiga olib keladi
(54-58-qatorlar) istisnoni hal qilish uchun. Stack izi istisnoni ko'rsatadi
sodir bo'ldi va Stack usuli pop faylning 32-qatorida istisno hosil qilganligini ko'rsatadi
Stack.java (21.7-rasm). Track, shuningdek, pop usuli StackTest tomonidan chaqirilganligini ko'rsatadi
StackTest.java ning 50-qatoridagi testPopDouble usuli va bu usul testPopDouble
StackTest.java ning 17-qatoridagi main usulidan chaqirilgan. Ushbu ma'lumot sizga imkon beradi
istisno bo'lgan paytda usul chaqiruvi stekida bo'lgan usullarni aniqlash
sodir bo'ldi. Dastur istisnoni ushlaganligi sababli, istisno mavjud deb hisoblanadi
qayta ishlandi va dastur ishlashni davom ettirishi mumkin.
Avtomatik ochish 50-qatorda dastur ochilgan Double ob'ektini tayinlaganda sodir bo'ladi
stekdan ikkita ibtidoiy o'zgaruvchiga. 21.4-bo'limdan eslaylikki, kompilyator
to'g'ri turlarning umumiy usullardan qaytarilishini ta'minlash uchun qo'shimchalar kiritadi. O'chirishdan so'ng, Stack usuli pop ob'ekt turini qaytaradi, ammo testPopDouble'dagi mijoz kodi kutadi.
pop usuli qaytganida double olish uchun. Shunday qilib, kompilyator quyidagi kabi Double castni qo'shadi
PopValue ga tayinlangan qiymat pop tomonidan qaytarilgan Double ob'ektidan chiqariladi.
testPushInteger va testPopInteger usullari
testPushInteger usuli (62–73-qatorlar) qiymatlarni joylashtirish uchun Stack usuli push-ni chaqiradi.
integerStack to'liq bo'lguncha. testPopInteger usuli (76–96-qatorlar) integerStack-dan qiymatlarni olib tashlash uchun Stack usuli pop-ni chaqiradi. Yana bir bor, qiymatlar oxirgi, birinchi chiqish tartibida ochiladi. O'chirish vaqtida kompilyator mijoz kodini usulda ekanligini tan oladi
testPopInteger usuli pop qaytarilganda int olishni kutadi. Shunday qilib, kompilyator Integer castni qo'shadi, xuddi shunday
popValue ga tayinlangan qiymat pop tomonidan qaytarilgan Integer obyektidan qutidan chiqariladi.
Sinf stekini sinash uchun umumiy usullarni yaratish
testPushDouble va testPushInteger usullaridagi kod qiymatlarni Stack yoki Stack ga surish uchun deyarli bir xil, mos ravishda va testPopDouble va testPopInteger usullaridagi kod qiymatlarni ochish uchun deyarli bir xil.
Mos ravishda stack yoki Stack. Bu yana bir imkoniyatdir
umumiy usullardan foydalaning. 21.10-rasmda 21.9-rasmdagi testPushDouble va testPushInteger bilan bir xil vazifalarni bajarish uchun testPush umumiy usuli (24–35-qatorlar) e'lon qilingan, ya'ni push.
qiymatlarni Stack ga kiriting. Xuddi shunday, testPop umumiy usuli (38–58-qatorlar) ni bajaradi
21.9-rasmdagi testPopDouble va testPopInteger bilan bir xil vazifalar, ya'ni pop qiymatlari a
Stack. 21.10-rasmning chiqishi 21.9-rasmdagiga to'liq mos keladi.
popValue = ( Double ) stack.pop();
popValue = ( Integer ) stack.pop();
1 // 21.10-rasm: StackTest2.java
2 // Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish.
3 umumiy sinf StackTest2
4 {
5 ta umumiy statik bekor asosiy ( String [] args )
6 {
21.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (3-qismning 1-qismi.)
890 21-bob Umumiy sinflar va usullar
7 [] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
8 [] integerElements = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
9
10 // Stack< Double > va Stack< Integer > yarating
11 Stack< Double > doubleStack = yangi Stack< Double >( 5 );
12 Stack< Integer > integerStack = new Stack< Integer >();
13
14
15
16
17
18
19
20
21 } // asosiyni tugatish
22
23 // testPush umumiy usuli elementlarni Stackga suradi
24
25
26 {
27 System.out.printf( "\nElementlarni %s ga surish\n", nom );
28
29 // elementlarni Stackga suring
( ) uchun 30
31 {
32 System.out.printf( "%s", element );
33 stack.push( element ); // elementni stekga surish
34 } // uchun tugatish
35 } // testPush tugatish usuli
36
37 // umumiy usul testPop stackdan elementlarni chiqaradi
38
39 {
40 // stekdan ochilgan elementlar
41 urinib ko'ring
42 {
43 System.out.printf( "\n%s dan elementlarni ochish\n", nomi );
44
45
46 // Stack-dan barcha elementlarni olib tashlang
47 vaqt (to'g'ri)
48 {
49 popValue = stack.pop();
50 System.out.printf( "%s", popValue );
51 } // tugash vaqti
52 } // urinishni tugatish
53 catch (EmptyStackException emptyStackException)
54 {
55 System.out.println();
56 emptyStackException.printStackTrace();
57 } // end catch EmptyStackException
58 } // tugatish usuli testPop
59 } // oxirgi sinf StackTest2
21.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (3 qismning 2-qismi.)
Ikki marta
Butun son

// doubleElements elementlarini doubleStack-ga surish


testPush("doubleStack", doubleStack, doubleElements); testPop ("doubleStack", doubleStack); // doubleStack-dan oching

// integerElements elementlarini integerStack-ga surish


testPush("integerStack", integerStack, integerElements);
testPop ("integerStack", integerStack); // integerStack dan ochiladi

umumiy statik < T > void testPush ( String nomi , Stack< T > stek,


T[] elementlar)
T elementi: elementlar
umumiy statik < T > void testPop (String nomi, Stack< T > stek)
T popValue; // stekdan olib tashlangan elementni saqlash
21.7 Xom turlari 891
11–12 qatorlar mos ravishda Stack va Stack obyektlarini yaratadi.
15–16 va 19–20 qatorlar Stackni sinash uchun testPush va testPop umumiy usullarini chaqiradi.
ob'ektlar. Chunki tip parametrlari massivlarni o'tkazish imkoniyatiga ega bo'lish uchun faqat mos yozuvlar turlarini ifodalashi mumkin
doubleElements va integerElements testPush umumiy usuliga, massivlarda e'lon qilingan
7-8 qatorlar Double va Integer o'rash turlari bilan e'lon qilinishi kerak. Qachon bu massivlar
ibtidoiy qiymatlar bilan ishga tushiriladi, kompilyator har bir primitiv qiymatni avtomatik qutilarga joylashtiradi.
Umumiy testPush usuli (24–35-qatorlar) T tipi parametridan foydalanadi (24-satrda ko'rsatilgan)
Stack da saqlangan ma'lumotlar turini ifodalash uchun. Umumiy usul uchta argumentni oladi - chiqish maqsadlari uchun Stack ob'ektining nomini ifodalovchi String, a
Stack tipidagi ob'ektga va T tipidagi massivga havola - elementlarning turi
Stack ga suriladi. Kompilyator turi o'rtasidagi muvofiqlikni ta'minlaydi
Stack va surish chaqirilganda Stackga suriladigan elementlar
umumiy usul chaqiruvining haqiqiy qiymati. TestPop umumiy usuli (38–58-qatorlar) oladi
ikkita argument — chiqish maqsadlari uchun Stack obyekti nomini va Stack tipidagi ob'ektga havolani ifodalovchi String.
21.7 Xom turlari
21.6-bo'limdagi Stack umumiy sinfi uchun sinov dasturlari Double va Integer argumentlari bilan Stacks-ni yaratadi. Bundan tashqari, umumiy sinf Stackni yaratish mumkin
argument turini quyidagicha belgilash:
Bu holda, objectStack xom turiga ega deyiladi, ya'ni kompilyator
har bir turdagi argument uchun umumiy sinf davomida ob'ekt turini bilvosita ishlatadi. Shunday qilib
oldingi bayonot har qanday turdagi ob'ektlarni saqlashi mumkin bo'lgan Stackni yaratadi. Bu muhim
Java-ning oldingi versiyalari bilan orqaga qarab muvofiqligi uchun. Masalan, ma'lumotlar tuzilmalari
Java Collections Framework (20-bobga qarang) ob'ektlarga barcha saqlangan havolalar, lekin ular
endi umumiy turlar sifatida amalga oshirilmoqda.
Elementlarni doubleStack-ga surish
1,1 2,2 3,3 4,4 5,5
DoubleStack-dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest2.testPop da (StackTest2.java:50)
StackTest2.main da (StackTest2.java:17)
IntegerStack-ga elementlarni surish
1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest2.testPop da (StackTest2.java:50)
StackTest2.main da (StackTest2.java:21
Stack objectStack = new Stack( 5); // hech qanday turdagi argument ko'rsatilmagan
21.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (3 qismning 3-qismi.)
892 21-bob Umumiy sinflar va usullar
Xom-turdagi Stack o'zgaruvchisiga turdagi argumentni belgilaydigan Stack tayinlanishi mumkin, masalan
Stack obyekti sifatida quyidagicha:
chunki Double turi Ob'ektning pastki sinfidir. Ushbu topshiriqga ruxsat beriladi chunki Stack dagi elementlar (ya'ni, Double ob'ektlar) albatta ob'ektlardir - Double sinfi
Ob'ektning bilvosita kichik sinfi.
Xuddi shunday, o'z deklaratsiyasida turdagi argumentni belgilaydigan Stack o'zgaruvchisi bo'lishi mumkin
quyidagi kabi xom turdagi Stack ob'ektini tayinladi:
Bu topshiriqga ruxsat berilgan boʻlsa-da, bu xavfli, chunki xom turdagi stek saqlashi mumkin
Integerdan boshqa turlar. Bunday holda, kompilyator xavfli topshiriqni ko'rsatadigan ogohlantirish xabarini chiqaradi.
Umumiy sinf stack bilan xom turlaridan foydalanish
21.11-rasmdagi test dasturi xom turdagi tushunchasidan foydalanadi. 11-qator umumiy ko'rinishni keltirib chiqaradi
rawTypeStack1 har qanday ob'ektlarni saqlashi mumkinligini ko'rsatadigan xom turdagi stack sinfi
turi. 14-qator rawTypeStack2 o'zgaruvchisiga Stack ni tayinlaydi, bu o'zgaruvchi sifatida e'lon qilinadi.
Xom turdagi stack. 17-qator Stack o'zgaruvchisiga xom turdagi Stackni tayinlaydi, bu
qonuniydir, lekin kompilyatorga potentsial xavfli topshiriqni ko'rsatuvchi ogohlantirish xabarini chiqarishiga sabab bo'ladi (21.12-rasm) - yana, bu xom turdagi Stack turlarini saqlashi mumkinligi sababli yuzaga keladi.
Integerdan boshqa. Shuningdek, 19-qatorlarda testPush va testPop umumiy usullariga qo'ng'iroqlar.
22 natijasida kompilyator ogohlantirish xabarlari paydo bo'ladi (21.12-rasm). Bu rawTypeStack1 tufayli yuzaga keladi
va rawTypeStack2 xom turdagi Stacks deb e'lon qilinadi, ammo testPush va usullari
testPop har biri ma'lum turdagi argumentga ega Stack bo'lgan ikkinchi argumentni kutadi. The
ogohlantirishlar kompilyator steklar tomonidan boshqariladigan turlarga kafolat bera olmasligini ko'rsatadi
to'g'ri turlar bo'lishi kerak, chunki biz tip argumenti bilan e'lon qilingan o'zgaruvchini taqdim etmadik.
testPush (28-39-qatorlar) va testPop (42-62-qatorlar) usullari 21.10-rasmdagi kabi.
21.12-rasmda fayl yaratilganda kompilyator tomonidan yaratilgan ogohlantirish xabarlari ko'rsatilgan
RawTypeTest.java (21.11-rasm) -Xlint:checked varianti bilan tuzilgan, bu
generiklardan foydalanadigan koddagi potentsial xavfli operatsiyalar haqida ko'proq ma'lumot beradi.
Birinchi ogohlantirish 17-qator uchun ishlab chiqariladi, bu esa xom-turdagi Stackni tayinlaydi.
Stack o'zgaruvchisi - kompilyator Stackdagi barcha ob'ektlar bo'lishini ta'minlay olmaydi
Butun sonli obyektlar. Keyingi ogohlantirish 19-satrda sodir bo'ladi. Kompilyator usulni belgilaydi
Double massividan testPush turi argumenti uchinchi argument sifatida o'tdi, chunki
ikkinchi usul argumenti xom-turdagi Stack o'zgaruvchisidir. Bunday holda, Double - bu tur
argument, shuning uchun kompilyator ikkinchi argument sifatida Stack ni kutadi. Ogohlantirish
kompilyator xom-turdagi Stackda faqat Doublelarni o'z ichiga olishiga ishonch hosil qila olmasligi sababli yuzaga keladi.
21-qatordagi ogohlantirish xuddi shu sababga ko'ra sodir bo'ladi, garchi haqiqiy Stack bu
rawTypeStack2 havolalari Stack hisoblanadi. Kompilyator kafolat bera olmaydi
o'zgaruvchi har doim bir xil Stack ob'ektiga murojaat qiladi, shuning uchun u e'lon qilingan o'zgaruvchidan foydalanishi kerak
barcha turdagi tekshirishni amalga oshirish uchun yozing. 20 va 22-qatorlar har biri ogohlantirishlarni yaratadi, chunki usul
testPop argument sifatida turdagi argument ko'rsatilgan Stackni kutadi.
Biroq, testPop-ga har bir qo'ng'iroqda biz xom turdagi Stack o'zgaruvchisini o'tkazamiz. Shunday qilib, kompilyator
ogohlantirishni bildiradi, chunki u usul tanasida ishlatiladigan turlarni tekshira olmaydi. In
Umuman olganda, siz xom turlarini ishlatishdan qochishingiz kerak.
Stack rawTypeStack2 = yangi Stack< Double >( 5 );
Stack< Integer > integerStack = new Stack( 10 );
21.7 Xom turlari 893
1 // 21.11-rasm: RawTypeTest.java
2 // Xom turdagi test dasturi.
3 umumiy sinf RawTypeTest4 {
5 ta umumiy statik bekor asosiy ( String [] args )
6 {
7 Double[] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
8 Integer[] integerElements = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
9
10
11
12
13
14
15
16
17
18
19 testPush("rawTypeStack1", rawTypeStack1, doubleElements);
20 testPop("rawTypeStack1", rawTypeStack1);
21 testPush("rawTypeStack2", rawTypeStack2, doubleElements);
22 testPop("rawTypeStack2", rawTypeStack2);
23 testPush( "integerStack", integerStack, integerElements );
24 testPop("integerStack", integerStack);
25 } // asosiyni tugatish
26
27 // umumiy usul elementlarni stekga suradi
28 umumiy statik < T > void testPush (String nomi, Stack< T > stek,
29 T[] element)
30 {
31 System.out.printf( "\nElementlarni %s ga surish\n", nom );
32
33 // elementlarni Stackga suring
34 uchun ( T element : elementlar )
35 {
36 System.out.printf( "%s", element );
37 stack.push( element ); // elementni stekga surish
38 } // uchun tugatish
39 } // testPush tugatish usuli
40
41 // testPop umumiy usuli stekdan elementlarni chiqaradi
42 umumiy statik < T > void testPop ( String nomi, Stack< T > stek )
43 {
44 // stekdan ochilgan elementlar
45 urinib ko'ring
46 {
47 System.out.printf( "\n%s dan elementlarni ochish\n", nomi );
48 T popValue; // stekdan olib tashlangan elementni saqlash
49
50 // Stack-dan elementlarni olib tashlang
51 vaqt (to'g'ri)
52 {
53 popValue = stack.pop(); // stekdan ochiladi
21.11-rasm | Xom turdagi test dasturi. (2-qismning 1-qismi.)
// Xom turdagi stek o'zgaruvchiga tayinlangan xom turdagi stek
Stack rawTypeStack1 = yangi Stack( 5);

// Stack< Double > xom turdagi o'zgaruvchilar stackiga tayinlangan


Stack rawTypeStack2 = yangi Stack< Double >( 5 );

// Stack< Integer > o'zgaruvchisiga tayinlangan xom turdagi stek


Stack< Integer > integerStack = new Stack( 10 );

894 21-bob Umumiy sinflar va usullar


54 System.out.printf( "%s", popValue );
55 } // tugash vaqti
56 } // urinishni tugatish
57 catch (EmptyStackException emptyStackException)
58 {
59 System.out.println();
60 ta emptyStackException.printStackTrace();
61 } // end catch EmptyStackException
62 } // tugatish usuli testPop
63 } // oxirgi sinf RawTypeTest
Elementlarni rawTypeStack1 ga surish
1,1 2,2 3,3 4,4 5,5
rawTypeStack1 dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:20)
Elementlarni rawTypeStack2 ga surish
1,1 2,2 3,3 4,4 5,5
rawTypeStack2 dan elementlarni ochish
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:22) IntegerStack-ga elementlarni surish
1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:24)
RawTypeTest.java: 17: ogohlantirish: [belgilanmagan] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
Stack< Integer > integerStack = new Stack( 10 );
^
RawTypeTest.java: 19: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPush("rawTypeStack1", rawTypeStack1, doubleElements);
^
21.12-rasm | Kompilyatordan ogohlantirish xabarlari. (2-qismning 1-qismi.)
21.11-rasm | Xom turdagi test dasturi. (2-qismning 2-qismi.)
21.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 895
21.8 Turni qabul qiluvchi usullardagi joker belgilar
Parametrlar
Ushbu bo'limda biz joker belgilar deb nomlanuvchi kuchli generik tushunchani taqdim etamiz. Buning uchun
Buning uchun biz java.util paketidan yangi ma'lumotlar tuzilmasini ham kiritamiz. In
20-bobda biz Java Collections Framework-ni muhokama qildik, u ko'plab umumiy ma'lumotlarni taqdim etadi
ma'lumotlar tuzilmalari va ma'lumotlar tuzilmalarining elementlarini boshqaradigan algoritmlar. Ehtimol, ushbu ma'lumotlar tuzilmalarining eng oddiyi ArrayList sinfidir - dinamik ravishda o'zgartiriladigan, massivga o'xshash ma'lumotlar tuzilmasi. Ushbu muhokamaning bir qismi sifatida siz ArrayListni qanday yaratishni o'rganasiz,
unga elementlar qo'shing va kengaytirilgan for bayonotidan foydalanib, ushbu elementlarni kesib o'ting.
Keling, joker belgilarni rag'batlantiradigan misolni ko'rib chiqaylik. Aytaylik, siz ArrayList kabi to'plamdagi raqamlarni jamlaydigan umumiy usul yig'indisini amalga oshirishni xohlaysiz.
Siz to'plamga raqamlarni kiritishdan boshlaysiz. Chunki umumiy sinflardan foydalanish mumkin
faqat sinf yoki interfeys turlari bilan, raqamlar typeRawTypeTest.java:19 ob'ektlari sifatida avtomatik qutiga joylashtiriladi: ogohlantirish: [checked] belgilanmagan usulni chaqirish:
testPush(java.lang.String,Stack,T[]) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack,java.lang.Double[])
testPush("rawTypeStack1", rawTypeStack1, doubleElements);
^
RawTypeTest.java: 20: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPop("rawTypeStack1", rawTypeStack1);
^
RawTypeTest.java:20: ogohlantirish: [belgilanmagan] belgilanmagan usulni chaqirish:
testPop(java.lang.String,Stack) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack)
testPop("rawTypeStack1", rawTypeStack1);
^
RawTypeTest.java: 21: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPush("rawTypeStack2", rawTypeStack2, doubleElements);
^
RawTypeTest.java:21: ogohlantirish: [checked] belgilanmagan usulni chaqirish:
testPush(java.lang.String,Stack,T[]) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack,java.lang.Double[])
testPush("rawTypeStack2", rawTypeStack2, doubleElements);
^
RawTypeTest.java: 22: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPop ("rawTypeStack2", rawTypeStack2);
^
RawTypeTest.java:22: ogohlantirish: [belgilanmagan] belgilanmagan usulni chaqirish:
testPop(java.lang.String,Stack) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack)
testPop ("rawTypeStack2", rawTypeStack2);
^
9 ta ogohlantirish
21.12-rasm | Kompilyatordan ogohlantirish xabarlari. (2-qismning 2-qismi.)
896 21-bob Umumiy sinflar va usullar
o'rash sinflari. Misol uchun, har qanday int qiymati Integer ob'ekti sifatida autoboxed bo'ladi va
har qanday juft qiymat Double ob'ekt sifatida autoboxed bo'ladi. Biz hammasini jamlay olishni xohlaymiz
turlaridan qat'i nazar, ArrayListdagi raqamlar. Shu sababli, biz ArrayListni Number argumenti turi bilan e'lon qilamiz Integer ham, Double ham super klassi.
Bundan tashqari, sum usuli ArrayList tipidagi parametrni va uning umumiy qiymatini oladi
elementlar. 21.13-rasmda Raqamlar qatori ro'yxatining elementlari jami ko'rsatilgan.
11-qator Raqamlar massivini e'lon qiladi va ishga tushiradi. Initsializatorlar ibtidoiy qiymatlar bo'lganligi sababli, Java har bir ibtidoiy qiymatni mos keladigan o'ramning ob'ekti sifatida avtomatik qutilarga joylashtiradi.
turi. 1 va 3 int qiymatlari Integer ob'ektlari sifatida avtomatik qutiga joylashtirilgan va qo'sh qiymatlar 2.4
va 4.1 Double ob'ektlar sifatida autoboxed qilingan. 12-qator ArrayList obyektini e'lon qiladi va yaratadi
u raqamlarni saqlaydi va uni numberList o'zgaruvchisiga tayinlaydi. Biz aniqlashtirishimiz shart emas
ArrayList hajmi, chunki biz ob'ektlarni kiritganimizda u avtomatik ravishda o'sib boradi.
1 // 21.13-rasm: TotalNumbers.java
2 // ArrayListdagi sonlarni jamlash.
3 import java.util.ArrayList;
45
umumiy toifadagi TotalNumbers
6 {
7 ta umumiy statik bekor asosiy ( String [] args )
8 {
9 // o'z ichiga olgan Raqamlar ArrayListini yaratish, ishga tushirish va chiqarish
10 // Integers va Doubles, so'ngra elementlarning umumiy sonini ko'rsatadi
11
12
13
14 uchun ( Raqam elementi : raqamlar )
15
16
17 System.out.printf( "raqamlar roʻyxatida: %s\n", );
18 System.out.printf( "Raqamlar roʻyxatidagi elementlarning umumiy soni: %.1f\n",
19);
20 } // asosiyni tugatish
21
22 // ArrayList elementlarining umumiy sonini hisoblang
23 umumiy statik ikki tomonlama yig'indi (ro'yxat)
24 {
25 juft jami = 0; // jami ishga tushirish
26
27 // summani hisoblang
28
29
30
Jami 31 daromad;
32 } // yakuniy usul summasi
33 } // yakuniy sinf TotalNumbers
numberList tarkibiga quyidagilar kiradi: [1, 2.4, 3, 4.1]
Raqamlar ro'yxatidagi elementlarning umumiy soni: 10.5
21.13-rasm | ArrayListdagi sonlarni jamlash.
Raqam [] raqamlar = { 1, 2.4, 3, 4.1 }; // Butun sonlar va juftliklar
ArrayList< Number > numberList = new ArrayList< Number >();
numberList.add (element); // har bir raqamni raqamlar ro'yxatiga joylashtiring
raqamlar ro'yxati
yig'indisi (raqamlar ro'yxati)
ArrayList< Raqam >
uchun (raqam elementi: ro'yxat)
jami += element.doubleValue();

21.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 897


14-15 qatorlar massiv raqamlarini o'tkazing va har bir elementni numberList-ga joylashtiring. 17-qator
ArrayList tarkibini String sifatida chiqaradi. Bu bayonot bilvosita chaqiradi
ArrayListning toString usuli, bu “[elementlar]” shaklidagi satrni qaytaradi.
elementlar vergul bilan ajratilgan elementlar roʻyxatidir. 18–19 qatorlar
sum usuliga chaqiruv orqali qaytariladigan elementlar yig'indisini ko'rsatish.
Usul yig'indisi (23–32-qatorlar) Raqamlar qatori ro'yxatini oladi va umumiy miqdorni hisoblaydi
to'plamdagi raqamlardan. Usul hisob-kitoblarni bajarish uchun ikkilamchi qiymatlardan foydalanadi va natijani ikki barobar qilib qaytaradi. 28–29 qatorlar kengaytirilgan for bayonotidan foydalanadi,
ArrayList elementlarini jamlash uchun massivlar va Collections Framework to'plamlari bilan ishlash uchun mo'ljallangan. for bayonoti har bir raqamni belgilaydi
ArrayList-ni o'zgaruvchi elementga kiriting, keyin doubleValue Number usulidan foydalanadi olish uchun
Raqamning asosiy ibtidoiy qiymati ikki tomonlama qiymat sifatida. Natija jamiga qo'shiladi. Qachon
tsikl tugaydi, usul jami qaytaradi.
Uning parametrida joker belgilar turi argumenti bilan usul summasini amalga oshirish
Eslatib o'tamiz, 21.13-rasmdagi yig'indi usulining maqsadi saqlangan har qanday turdagi raqamlarni jamlash edi.
ArrayList ichida. Biz Integer va ikkalasini o'z ichiga olgan Raqamlar ArrayListini yaratdik
Ikki tomonlama ob'ektlar. 21.13-rasmdagi ma'lumotlar yig'indisi usul to'g'ri ishlaganligini ko'rsatadi.
Usul summasi ArrayList of Numbers elementlarini jamlashi mumkinligini hisobga olsak, bu usul faqat bitta elementlarni o'z ichiga olgan ArrayLists uchun ham ishlashini kutishingiz mumkin.
raqamli tip, masalan, ArrayList. Shunday qilib, biz yaratish uchun TotalNumbers sinfini o'zgartirdik
Butun sonlar ArrayList va uni sum usuliga o'tkazing. Dasturni kompilyatsiya qilganimizda,
kompilyator quyidagi xato xabarini chiqaradi:
Number Integer ning yuqori sinfi bo'lsa-da, kompilyator ArrayList parametrlangan turini ArrayList ning yuqori sinfi deb hisoblamaydi. Agar shunday bo'lsa,
keyin ArrayList da bajarishimiz mumkin bo'lgan har bir operatsiya ArrayListda ham ishlaydi. ArrayList ga Double ob'ektini qo'shishingiz mumkinligini ko'rib chiqing, chunki Double - bu raqam, lekin Double ob'ektini qo'sha olmaysiz.
ArrayList chunki Double butun son emas. Shunday qilib, subtip munosabatlari
tutmaydi.
Raqamning istalgan kichik sinfi elementlarini o'z ichiga olgan har qanday ArrayList elementlarini jamlay oladigan summa usulining yanada moslashuvchan versiyasini qanday yaratamiz? Bu joy
joker belgilar turi argumentlari muhim. Joker belgilar sizga usul parametrlarini, qaytariladigan qiymatlarni, o'zgaruvchilar yoki maydonlarni va hokazolarni belgilash imkonini beradi, ular supertiplar yoki pastki tiplar sifatida ishlaydi.
parametrlangan turlar. 21.14-rasmda usul summasining parametri 50-satrda e'lon qilingan.
turi:
Joker tipdagi argument savol belgisi (?) bilan belgilanadi, bu oʻz-oʻzidan anni ifodalaydi
"noma'lum tur." Bunday holda, joker belgi sinf raqamini kengaytiradi, bu degani
joker belgida Raqamning yuqori chegarasi mavjud. Shunday qilib, noma'lum turdagi argument Raqam yoki Raqamning pastki sinfi bo'lishi kerak. Bu erda ko'rsatilgan parametr turi bilan, usul summasi mumkin
ArrayList< kabi har qanday raqam turini o'z ichiga olgan ArrayList argumentini oling
Integer> (20-qator), ArrayList (33-qator) yoki ArrayList (46-qator).
sum(java.util.ArrayList) TotalNumbersErrors ichida
(java.util.ArrayList) ga qoʻllash mumkin emas.
ArrayList
898 21-bob Umumiy sinflar va usullar
1 // 21.14-rasm: WildcardTest.java
2 // Wildcard test dasturi.
3 import java.util.ArrayList;
45
umumiy sinf WildcardTest
6 {
7 ta umumiy statik bekor asosiy ( String [] args )
8 {
9 // Butun sonlar ArrayListini yarating, ishga tushiring va chiqaring
10 // elementlarning umumiy miqdorini ko'rsatish
11 Integer[] integers = { 1, 2, 3, 4, 5};
12
13
14 // integerList-ga elementlarni kiriting
15 uchun ( Integer element : integers )
16 integerList.add( element );
17
18 System.out.printf( "integerList tarkibida: %s\n", integerList );
19 System.out.printf( "IntegerListdagi elementlarning jami: %.0f\n\n",
20); 21
22 // ArrayList of Doubles ni yarating, ishga tushiring va chiqaring, keyin
23 // elementlarning umumiyligini ko'rsatish
24 Double[] ikki barobar = {1,1, 3,3, 5,5};
25
26
27 // doubleList-ga elementlarni kiriting
28 uchun ( Double element : double )
29 doubleList.add( element );
30
31 System.out.printf( "doubleList tarkibida: %s\n", doubleList );
32 System.out.printf( "DoubleListdagi elementlarning umumiy soni: %.1f\n\n",
33);
34
35 // o'z ichiga olgan Raqamlar ArrayListini yarating, ishga tushiring va chiqaring
36 // Integers ham, Doubles ham, so'ngra elementlarning umumiy sonini ko'rsatadi
37 ta raqam [] raqamlar = { 1, 2.4, 3, 4.1 }; // Butun sonlar va juftliklar
38
39
40 // numberList-ga elementlarni kiriting
41 uchun ( Raqam elementi : raqamlar )
42 numberList.add( element );
43
44 System.out.printf( "numberList tarkibida: %s\n", numberList );
45 System.out.printf( "Raqamlar roʻyxatidagi elementlarning umumiy soni: %.1f\n",
46);
47 } // asosiyni tugatish
48
49 // elementlarning umumiy soni; ArrayList parametrida joker belgidan foydalanish
50 umumiy statik ikki tomonlama summa (roʻyxat)
51 {
52 juft jami = 0; // jami ishga tushirish
53
21.14-rasm | Umumiy joker belgilar test dasturi. (2-qismning 1-qismi.)
ArrayList< Integer > integerList = new ArrayList< Integer >();
summa (integerList)
ArrayList< Double > doubleList = yangi ArrayList< Double >();
summa ( doubleList )
ArrayList< Number > numberList = new ArrayList< Number >();
yig'indisi (raqamlar ro'yxati)
ArrayList
21.9 Generics va meros: Eslatmalar 899
11–20 qatorlar ArrayList ni yaratadi va ishga tushiradi, uning elementlarini chiqaradi va
sumni chaqirish usuli bo'yicha ularni jami (20-satr). 24–33 qatorlar xuddi shu amallarni bajaradi
ArrayList. 37-46 qatorlar butun sonlar va juftlarni o'z ichiga olgan ArrayList uchun bir xil amallarni bajaradi.
Usul summasida (50–59-qatorlar), garchi ArrayList argumentining element turlari
usuli bilan to'g'ridan-to'g'ri ma'lum emas, ular hech bo'lmaganda Number turiga ma'lum, chunki
joker belgi yuqori chegara Raqam bilan ko'rsatilgan. Shuning uchun 56-qatorga ruxsat beriladi,
chunki barcha Number obyektlarida doubleValue usuli mavjud.
Parametrlashtirilgan turlarni usulga o'tkazishda joker belgilar moslashuvchanlikni ta'minlasa ham,
ularning kamchiliklari ham bor. Chunki usul sarlavhasidagi joker belgi (?).
50) tip-parametr nomini belgilamaydi, siz uni butun tur nomi sifatida ishlata olmaysiz
usul tanasi (ya'ni, siz 55-qatordagi Raqamni ? bilan almashtira olmaysiz). Biroq, mumkin edi
usul summasini quyidagicha e'lon qiling:
Bu usul har qanday raqamning elementlarini o'z ichiga olgan ArrayListni olish imkonini beradi
kichik sinf. Keyin butun usul tanasida T turi parametridan foydalanishingiz mumkin.
Agar joker belgi yuqori chegarasiz ko'rsatilgan bo'lsa, u holda faqat tiplash usullari
Ob'ekt joker belgilar turidagi qiymatlarda chaqirilishi mumkin. Shuningdek, joker belgilarni ishlatadigan usullar
ularning parametrlari turi argumentlarini havola qilingan to'plamga elementlar qo'shish uchun ishlatib bo'lmaydi
parametr bo'yicha.
21.9 Generiklar va meros: Eslatmalar
Generics meros bilan bir necha usulda ishlatilishi mumkin: Umumiy sinf umumiy bo'lmagan sinfdan olinishi mumkin. Masalan, Ob'ekt
sinf har bir umumiy sinfning bevosita yoki bilvosita yuqori sinfidir.
54 // summani hisoblang
55 uchun ( Raqam elementi : ro'yxat )
56 jami += element.doubleValue();
57
Jami 58 daromad;
59 } // yakuniy usul summasi
60 } // yakuniy sinf WildcardTest
integerList tarkibiga quyidagilar kiradi: [1, 2, 3, 4, 5]
IntegerListdagi elementlarning umumiy soni: 15
doubleList tarkibiga quyidagilar kiradi: [1.1, 3.3, 5.5]
DoubleListdagi elementlarning umumiy soni: 9.9
numberList tarkibiga quyidagilar kiradi: [1, 2.4, 3, 4.1]
Raqamlar ro'yxatidagi elementlarning umumiy soni: 10.5
umumiy statik ikki marta yig'indi (ArrayList< T > ro'yxati)
Umumiy dasturlash xatosi 21.4
Usulning tip-parametr qismida joker belgidan foydalanish yoki aniq belgi sifatida joker belgidan foydalanish
usul tanasidagi o'zgaruvchining turi sintaksis xatosidir.
21.14-rasm | Umumiy joker belgilar test dasturi. (2-qismning 2-qismi.)
900 21-bob Umumiy sinflar va usullar
• Umumiy sinf boshqa umumiy sinfdan olinishi mumkin. Masalan, umumiy
class Stack (java.util paketida) umumiy Vektor sinfining quyi sinfidir (java.util paketida). Biz bu sinflarni 20-bobda muhokama qildik.
• Umumiy bo'lmagan sinf umumiy sinfdan olinishi mumkin. Masalan, umumiy bo'lmagan
Xususiyatlar sinfi (java.util paketida) Hashtable umumiy sinfining pastki sinfidir
(java.util paketida). Biz bu sinflarni 20-bobda ham muhokama qildik.
• Nihoyat, agar ikkala usul ham bir xil imzoga ega bo'lsa, pastki sinfdagi umumiy usul superklassdagi umumiy usulni bekor qilishi mumkin.
21.10 Yakunlash
Ushbu bobda generiklar kiritilgan. Siz umumiy usullar va sinflarni qanday e'lon qilishni o'rgandingiz.
Xom turlar orqali orqaga qarab muvofiqlikka qanday erishish mumkinligini muhokama qildik. Siz ham qanday qilib o'rgandingiz
umumiy usulda yoki umumiy sinfda joker belgilardan foydalanish. 22-bobda siz qanday qilishni o'rganasiz
ijro etilayotganda o'sishi yoki qisqarishi mumkin bo'lgan shaxsiy dinamik ma'lumotlar tuzilmalaringizni amalga oshiring
vaqt. Xususan, siz ushbu ma'lumotlar tuzilmalarini umumiy imkoniyatlardan foydalangan holda amalga oshirasiz
Siz ushbu bobda bilib oldingiz. Jeneriklar haqida qoʻshimcha maʼlumot olish uchun www.deitel.com/Java/ manzilidagi Java Resurs Markazimizga tashrif buyuring va “Java Generics” mavzusini bosing.
Sarlavha Resurs markazi tarkibi.
Xulosa
21.1-bo'lim Kirish
• Umumiy usullar sizga bitta usul deklaratsiyasi bilan bog'liq usullar to'plamini belgilash imkonini beradi.
• Umumiy sinflar va interfeyslar sizga tegishli turlar to'plamini belgilash imkonini beradi.
21.2-bo'lim Umumiy usullar uchun motivatsiya
• Har xil turdagi ma'lumotlarga o'xshash operatsiyalarni bajarish uchun ko'pincha ortiqcha yuklangan usullar qo'llaniladi.
• Kompilyator usul chaqiruviga duch kelganda, u usul deklaratsiyasini a bilan topishga harakat qiladi
usul chaqiruvidagi argument turlariga mos keladigan nom va parametrlar.
21.3-bo'lim Umumiy usullar: Amalga oshirish va kompilyatsiya vaqti tarjimasi
• Agar bir nechta haddan tashqari yuklangan usullar bilan bajariladigan amallar har bir argument turi uchun bir xil bo'lsa,
ular umumiy usul yordamida yanada ixcham va qulayroq kodlanishi mumkin. Yagona umumiy
usul deklaratsiyasini har xil turdagi ma'lumotlarning argumentlari bilan chaqirish mumkin. Turlari asosida
argumentlar umumiy usulga o'tgan bo'lsa, kompilyator har bir usul chaqiruvini mos ravishda boshqaradi.
• Barcha umumiy usul deklaratsiyasida burchakli qavslar (< va >) bilan chegaralangan, usulning qaytarish turidan (878-bet) oldin tur parametrlari bo‘limi (878-bet) mavjud. Tur-parametr bo'limi vergul bilan ajratilgan bir yoki bir nechta turdagi parametrlarni o'z ichiga oladi.
• Tur parametri (878-bet) umumiy tip nomini bildiruvchi identifikatordir. Tip parametrlari mumkin
umumiy usul deklaratsiyasida qaytarish turi, parametr turlari va mahalliy o'zgaruvchilar turlari sifatida foydalanish,
va ular umumiy usulga o'tkazilgan argumentlar turlari uchun to'ldiruvchi vazifasini bajaradi
haqiqiy turdagi argumentlar sifatida tanilgan (878-bet). Tur parametrlari faqat mos yozuvlar turlarini ifodalashi mumkin.
• Usul deklaratsiyasida foydalaniladigan tip-parametr nomlari e'lon qilinganlarga mos kelishi kerak
tip-parametr bo'limi. Tip-parametr nomi faqat bir marta tip-parametrda e'lon qilinishi mumkin
bo'limi, lekin usul parametrlari ro'yxatida bir necha marta paydo bo'lishi mumkin.
Xulosa 901
• Kompilyator usul chaqiruviga duch kelganda, u argument turlarini va urinishlarini aniqlaydi
argument turlariga mos keladigan bir xil nom va parametrlarga ega usulni toping. Agar mavjud bo'lsa
Bunday usul bo'lmasa, kompilyator bir xil nomli va mos parametrlarga ega usullarni va mos keladigan umumiy usullarni qidiradi.
• Umumiy interfeysni amalga oshiradigan sinf ob'ektlari Comparable (Comparable) solishtirish mumkin
Agar ob'ektlar teng bo'lsa, 0 ni, agar qiymatlar teng bo'lsa, manfiy butun sonni qaytaradigan compareTo usuli bilan (880-bet)
birinchi ob'ekt ikkinchidan kichik yoki birinchi ob'ekt ikkinchidan katta bo'lsa, musbat butun son.
• Primitiv turlar uchun barcha turdagi o'rash sinflari Comparable ni amalga oshiradi.
• Taqqoslanadigan obyektlardan Collections sinfining saralash va qidirish usullari bilan foydalanish mumkin.
• Umumiy usul kompilyatsiya qilinganda, kompilyator o'chirishni amalga oshiradi (879-bet) typeparameter bo'limini olib tashlash va tip parametrlarini haqiqiy turlarga almashtirish. Sukut bo'yicha har bir turdagi parametr o'zining yuqori chegarasi (881-bet) bilan almashtiriladi, agar boshqacha ko'rsatilmagan bo'lsa, bu Ob'ekt.
21.4-bo'lim Qo'shimcha kompilyatsiya vaqti tarjimasi muammolari: Turdan foydalanadigan usullar
Qaytish turi sifatida parametr
• Oʻchirish turi oʻzgaruvchini qaytaruvchi usulda bajarilganda (878-bet), aniq translatsiyalar amalga oshiriladi.
Qaytarilgan qiymat kutilgan turga ega bo'lishini ta'minlash uchun har bir usul chaqiruvi oldiga kiritilgan
qo'ng'iroq qiluvchi.
21.5-bo'lim Umumiy usullarni ortiqcha yuklash
• Umumiy usul boshqa umumiy usullar yoki umumiy bo'lmagan usullar bilan ortiqcha yuklanishi mumkin.
21.6-bo'lim Umumiy sinflar
• Umumiy sinflar sinfni turga bog'liq bo'lmagan tarzda tavsiflash uchun vositani taqdim etadi. Biz bajara olamiz
keyin umumiy sinfning turiga xos ob'ektlarni yarating.
• Umumiy sinf deklaratsiyasi umumiy bo‘lmagan sinf deklaratsiyasiga o‘xshaydi, bundan tashqari sinf nomi
keyin tip-parametr bo'limi. Umumiy sinfning tip-parametr bo'limi bitta bo'lishi mumkin
yoki bir nechta turdagi parametrlar vergul bilan ajratilgan.
• Umumiy sinf kompilyatsiya qilinganda, kompilyator sinf turi parametrlarida o'chirishni amalga oshiradi
va ularni yuqori chegaralari bilan almashtiradi.
• Tur parametrlarini sinfning statik deklaratsiyasida ishlatib bo‘lmaydi.
• Umumiy sinf ob'ektini instantsiyalashda sinfdan keyin burchakli qavslarda ko'rsatilgan turlar
nomlar turdagi argumentlar sifatida tanilgan (886-bet). Kompilyator ularni tip parametrlarini almashtirish uchun ishlatadi, shunda u tipni tekshirishni amalga oshiradi va kerak bo'lganda translatsiya operatsiyalarini kiritadi.
21.7-bo'lim Xom turlari
• Tur argumentini ko'rsatmasdan umumiy sinfni yaratish mumkin. Bunday holda, yangi
sinf ob'ekti xom turiga ega deyiladi (891-bet) - kompilyator ob'ekt turini bilvosita ishlatadi
(yoki turdagi parametrning yuqori chegarasi) har bir turdagi argument uchun umumiy sinf bo'ylab.
21.8-bo'lim Tur parametrlarini qabul qiluvchi usullardagi joker belgilar
• Class Number ham Integer, ham Doublening yuqori sinfidir.
• DoubleValue raqam usuli (897-bet) Raqamning asosiy ibtidoiy qiymatini ikkilik sifatida oladi
qiymat. Joker belgilar turi argumentlari usul parametrlarini, qaytariladigan qiymatlarni, oʻzgaruvchilarni va
Shunday qilib, ular parametrlangan turlarning supertiplari sifatida ishlaydi. Joker belgilar tipidagi argument bilan belgilanadi?
(897-bet), bu “noma’lum tur”ni ifodalaydi. Joker belgining yuqori chegarasi ham bo'lishi mumkin.
902 21-bob Umumiy sinflar va usullar
• Joker belgi (?) tip-parametr nomi emasligi sababli, siz uni butun tur nomi sifatida ishlata olmaysiz
usul tanasi.
• Agar joker belgi yuqori chegarasiz ko'rsatilgan bo'lsa, u holda faqat Object tipidagi usullar bo'lishi mumkin
joker belgilar turi qiymatlarida chaqiriladi.
• Tur argumentlari sifatida joker belgilardan foydalanadigan usullardan (897-bet) parametr tomonidan havola qilingan to‘plamga elementlar qo‘shish uchun ishlatib bo‘lmaydi.
21.9-bo'lim Generiklar va meros: Eslatmalar
• Umumiy sinf umumiy bo'lmagan sinfdan olinishi mumkin. Masalan, Ob'ekt to'g'ridan-to'g'ri yoki bilvosita
har bir umumiy sinfning super klassi.
• Umumiy sinf boshqa umumiy sinfdan olinishi mumkin.
• Umumiy bo'lmagan sinf umumiy sinfdan olinishi mumkin.
• Agar ikkala usul ham boʻlsa, quyi sinfdagi umumiy usul supersinfdagi umumiy usulni bekor qilishi mumkin
bir xil imzolarga ega.
O'z-o'zini tekshirish mashqlari
21.1 (To'g'ri yoki noto'g'ri) Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ayting. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Umumiy usul umumiy bo'lmagan usul bilan bir xil usul nomiga ega bo'lishi mumkin emas.
b) Barcha umumiy usul e'lonlari darhol usul nomidan oldin tur-parametr bo'limiga ega.
c) Umumiy usul xuddi shu usul bilan boshqa umumiy usul bilan ortiqcha yuklanishi mumkin
nomi, lekin boshqa usul parametrlari.
d) Tip parametri tip-parametr bo'limida faqat bir marta e'lon qilinishi mumkin, lekin usul parametrlari ro'yxatida bir necha marta paydo bo'lishi mumkin.
e) Turli xil umumiy usullar orasidagi tip-parametr nomlari yagona bo'lishi kerak.
f) Umumiy sinf turi parametrining doirasi uning statik a'zolaridan tashqari butun sinfdir.
21.2 (Bo'sh joylarni to'ldiring) Quyidagilarning har biridagi bo'sh joylarni to'ldiring:
a) va sizga bitta usul deklaratsiyasi bilan bir qatorni belgilash imkonini beradi
tegishli usullar yoki bitta sinf deklaratsiyasi bilan, mos ravishda tegishli turlar to'plami.
b) Tur-parametr kesimi bilan chegaralangan.
c) Usulning argument turlarini aniqlash uchun umumiy usuldan foydalanish mumkin
usulning qaytish turini belgilang va usul ichidagi o'zgaruvchilarni e'lon qiling.
d) "Stack objectStack = new Stack();" bayonoti. objectStack saqlashini bildiradi
.
e) Umumiy sinf deklaratsiyasida sinf nomidan keyin a(n) .
f) Sintaksis joker belgining yuqori chegarasi T turi ekanligini bildiradi.
O'z-o'zini tekshirish mashqlariga javoblar
21.1 a) Noto'g'ri. Umumiy va umumiy bo'lmagan usullar bir xil usul nomiga ega bo'lishi mumkin. Umumiy
usul bir xil usul nomiga ega, ammo boshqa usul bilan boshqa umumiy usulni ortiqcha yuklashi mumkin
parametrlari. Umumiy usulni umumiy bo'lmagan usullar bilan ta'minlash orqali ham ortiqcha yuklash mumkin
bir xil usul nomi va argumentlar soni. b) yolg'on. Barcha umumiy usul deklaratsiyasi mavjud
usulning qaytish turidan darhol oldin turuvchi parametr bo'limi. c) To'g'ri. d) To'g'ri.
e) yolg'on. Turli xil umumiy usullar orasidagi parametr nomlari yagona bo'lishi shart emas. f) To'g'ri.
21.2 a) Umumiy usullar, umumiy sinflar. b) burchakli qavslar (< va >). c) tip parametrlari. d) a
xom turi. e) tip-parametr bo'limi. f) ? T.ni kengaytiradi.
903-mashqlar
Mashqlar
21.3 (Notatsiyani tushuntiring) Java dasturida quyidagi yozuvlardan foydalanishni tushuntiring:
umumiy sinf Massivi< T > { }
21.4 (Umumiy usul tanlashSort) Umumiy usul tanlashSortni yozing asosida
Shakllarning tartiblash dasturi. 19,6–19,7. Integer massivi va Float massivini kirituvchi, tartiblovchi va chiqaradigan test dasturini yozing. [Maslahat: f tip-parametr qismida > dan foydalaning

Download 97.37 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling