Juda daho odam dunyoni boshqa burchak ostida ko’radi uning hamkasblari
Download 97.37 Kb.
|
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: Ob'ektlar to'plamini boshqaradigan stack klassi, so'ngra stek uchun Stack ob'ektlarini yarating. Butun sonlar, Doubles to'plami, satrlar to'plami va boshqalar. Kompilyator bajarishi mumkin edi. 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 Comparable 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 21.3-rasmda printArray uchun belgilangan, u har qanday tarkibni o'z ichiga olgan massivlarni chiqarishga qodir edi. ob'ekt turi. Comparable 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 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 13-qatordagi maksimalga qo'ng'iroq uchta Stringni oladi, ular ham Comparable 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 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 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 Double”) va Stack 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 Mos ravishda stack 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 21.9-rasmdagi testPopDouble va testPopInteger bilan bir xil vazifalar, ya'ni pop qiymatlari a Stack 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 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 Stack Stack 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 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 chunki Double turi Ob'ektning pastki sinfidir. Ushbu topshiriqga ruxsat beriladi chunki Stack 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 Xom turdagi stack. 17-qator Stack 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 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 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 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: (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: (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: (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: (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 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 // ArrayList 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 | ArrayList 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 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 keyin ArrayList ArrayList 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 sum(java.util.ArrayList (java.util.ArrayList ArrayList Raqamni kengaytiradi > 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 Raqamni kengaytiradi > 21.9 Generics va meros: Eslatmalar 899 11–20 qatorlar ArrayList sumni chaqirish usuli bo'yicha ularni jami (20-satr). 24–33 qatorlar xuddi shu amallarni bajaradi ArrayList 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 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 Download 97.37 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling