— Xo'sh, yana bir kichik Generic mavzusidagi lektsiya.
Hozir men senga "tiplarni o'chirish" (Type erasure) ni qanday chetlab o'tishni aytib beraman.
— Ha. Bu haqida bilishni juda xohlayman.
— Ehtimol bilasan, Java'da Class turi bor, bu sinf ob'ektiga havola saqlash uchun ishlatiladi. Misollar:
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();
— Ha.
Lekin ehtimol bilmaydigoning, bu Generic bo'lgan yana bir Class turi bor. Va bu Generic Classning o'zgaruvchilari faqat parametr tipi bo'lgan tipga havolalarni saqlashi mumkin. Misollar:
Class<Integer> clazz1 = Integer.class; //hammasi ajoyib ishlaydi
Class<String> clazz2 = Integer.class; //kompilyatsiya xatosi.
Class<String> clazz1 = String.class; //hammasi ajoyib ishlaydi
Class<String> clazz2 = int.class; //kompilyatsiya xatosi.
Class<? extends String> clazz1 = "abc".getClass(); //hammasi ajoyib ishlaydi
Class<Object> clazz2 = "abc".getClass(); //kompilyatsiya xatosi.
— Va nima uchun bu shunday ishlaydi?
— Haqiqat shundaki, Integer.class turi uchun class maydonining qiymati aslida Class<Integer> turidagi ob'ekt.
Lekin keling, davom etamiz.
Shunday qilib, Class<T> — bu Generic va uning turi o'zgaruvchisi faqat T turidagi qiymatni saqlashi mumkinligini hisobga olib, bunday qilinadigan fokusli kombinatsiyani amalga oshirish mumkin:
class Zoo<T>
{
Class<T> clazz;
ArrayList<T> animals = new ArrayList<T>();
Zoo(Class<T> clazz)
{
this.clazz = clazz;
}
public T createNewAnimal()
{
T animal = clazz.newInstance();
animals.add(animal);
return animal
}
}
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // bu yerda tur uzatilmoqda!
Tiger tiger = zoo.createNewAnimal();
Bu mega fokusli kombinatsiya emas – biz faqat kerakli turga havolani uzatamiz. Lekin agar biz Class o'rniga Class<T> dan foydalangan bo'lsak, kimdir xato bilan ikki turli tur uzatishi mumkin edi – biri T parametri sifatida, ikkinchisi – konstruktor.
— Ha. Tushunaman. Juda ham ajablanarli hech narsa yo'q va qo'rqinchli ham emas. Mavjud turga havola bor, undan foydalanish mumkin, ishlaydi va tamom.
— Mana, "o'g'il bolaga qari kishini eshitayapman!" Ishlaydi va tamom – bu ko'p hollarda eng yaxshi variant.
Endi Java'da juda ko'p narsalarni qayta o'zgartirish mumkin bo'lsa-da, eski kod bilan moslikni saqlash kerak.
Bugungi kunda eng mashhur Java afzalligidan biri bu juda ko'p mashhur sinovdan o'tgan kutubxonalar. Shunday qilib, Java eski kod bilan moslikni saqlab, eng mashhur til bo'lib qoladi va shuning uchun radikal yangiliklarni joriy eta olmaydi.
— Men o'z Java'mni blackjack va ... bilan yarataman
— Yaxshi, men kun davomida charchadim. Xayr, ko'rishguncha.
— Xayr, Risha, va qiziqarli dars uchun rahmat.
GO TO FULL VERSION