Generics: ? wildcard

All lectures for UZ purposes
Daraja, Dars
Mavjud

— 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:

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:

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:

Misol
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
 }
}
Qanday foydalanish kerak
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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION