Java generiklar (generics)


ULASHISH

Java generiklar (generics)

Generiklar aniq tipni oldindan ko‘rsatmasdan turib, turli ma’lumot tiplari bilan ishlaydigan sinflar, interfeyslar va metodlar yozish imkonini beradi.

Bu kodingizni yanada moslashuvchan, qayta ishlatiladigan va tip jihatidan xavfsiz qiladi.


Nima uchun generiklardan foydalanish kerak?

  • Kodni qayta ishlatish: Turli ma’lumot tiplari bilan ishlaydigan bitta sinf yoki metod yozing.
  • Tip xavfsizligi: Tip xatolarini bajarilish vaqtida emas, kompilyatsiya vaqtidayoq aniqlang.
  • Toza kod: Obyektlarni olishda tipni o‘zgartirish (casting) talab qilinmaydi.

Generik sinf misoli

Generiklar yordamida turli ma’lumot tiplari bilan ishlaydigan sinf yaratishingiz mumkin:

class Box<T> {   T value; // T is a placeholder for any data type   void set(T value) {     this.value = value;   }   T get() {     return value;   } } public class Main {   public static void main(String[] args) {     // Create a Box to hold a String     Box<String> stringBox = new Box<>();     stringBox.set("Hello");     System.out.println("Value: " + stringBox.get());     // Create a Box to hold an Integer     Box<Integer> intBox = new Box<>();     intBox.set(50);     System.out.println("Value: " + intBox.get());   } }

O‘zingiz sinab ko‘ring »

T — generik tip parametri. U ma’lumot tipi uchun joy egasiga o‘xshaydi.

  • Box<String> yaratganingizda, T o‘rnini String egallaydi.
  • Box<Integer> yaratganingizda, T o‘rnini Integer egallaydi.

Shu tariqa bitta sinfni kodni qayta yozmasdan turli ma’lumot tiplari bilan qayta ishlatish mumkin.



Generik metod misoli

Generiklar yordamida istalgan ma’lumot tipi bilan ishlaydigan metodlar ham yaratishingiz mumkin:

public class Main {   // Generic method: works with any type T   public static <T> void printArray(T[] array) {     for (T item : array) {       System.out.println(item);     }   }   public static void main(String[] args) {     // Array of Strings     String[] names = {"Jenny", "Liam"};     // Array of Integers     Integer[] numbers = {1, 2, 3};     // Call the generic method with both arrays     printArray(names);     printArray(numbers);   } }

O‘zingiz sinab ko‘ring »

Misol izohi

  • <T> — generik tip parametri; u metod istalgan tip bilan ishlay olishini bildiradi: String, Integer, Double va h.k.
  • printArray() metodi T tipidagi massivni qabul qiladi va uning har bir elementini chiqaradi.
  • Metodni chaqirganingizda Java siz uzatgan argumentga qarab T qanday tip bo‘lishini aniqlaydi.

Bu har bir tip uchun kodni takrorlash o‘rniga bir nechta tip bilan ishlaydigan bitta metod yozmoqchi bo‘lganingizda foydali.


Cheklangan tiplar (bounded types)

Generik sinf yoki metod qabul qila oladigan tiplarni cheklash uchun extends kalit so‘zidan foydalanishingiz mumkin.

Masalan, tip Number sinfining voris sinfi (subclass) bo‘lishini talab qilishingiz mumkin:

class Stats<T extends Number> {   T[] nums;   // Constructor   Stats(T[] nums) {     this.nums = nums;   }   // Calculate average   double average() {     double sum = 0;     for (T num : nums) {       sum += num.doubleValue();     }     return sum / nums.length;   } } public class Main {   public static void main(String[] args) {     // Use with Integer     Integer[] intNums = {10, 20, 30, 40};     Stats<Integer> intStats = new Stats<>(intNums);     System.out.println("Integer average: " + intStats.average());     // Use with Double     Double[] doubleNums = {1.5, 2.5, 3.5};     Stats<Double> doubleStats = new Stats<>(doubleNums);     System.out.println("Double average: " + doubleStats.average());   } }

O‘zingiz sinab ko‘ring »

Birinchi holatda int qiymatlar ishlatilgan bo‘lsa-da, .doubleValue() metodi ularni double tipiga aylantiradi, shuning uchun natija kasr qismi bilan ko‘rsatiladi.

Misol izohi

  • <T extends Number>: T tipini faqat Integer, Double yoki Float kabi sonli tiplar bilan ishlashga cheklaydi.
  • .doubleValue(): Hisoblash uchun istalgan sonni double tipiga aylantiradi.
  • Elementlari Number sinfining voris sinflari bo‘lsa, istalgan sonlar massivi bilan ishlaydi.

Generik kolleksiyalar

ArrayList va HashMap kabi Java kolleksiyalari ichki tomondan generiklardan foydalanadi:

ArrayList<String> list = new ArrayList<>(); list.add("Apple"); String fruit = list.get(0); // No need to cast

Xulosa

  • Generiklar kodingizni moslashuvchan va tip jihatidan xavfsiz qiladi.
  • Tip uchun joy egasini belgilashda T yoki boshqa harfdan foydalaning.
  • Generiklarni sinflar, metodlar va interfeyslarga qo‘llash mumkin.
  • Qaysi tiplarga ruxsat berilishini cheklash uchun chegaralardan (bounds) foydalaning.


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!