Sobes.tech
Middle

Генерикҳо чистанд ва барои чӣ истифода мешаванд?

sobes.tech AI

Ҷавоб аз AI

Generics дар Java имкон медиҳанд, ки синфҳо, интерфейсҳо ва усулҳо бо намудҳои параметрӣ эҷод шаванд.

Мақсади асосии Generics:

  • Бехатарии навъро баланд бардоштани: Компилятор навъҳоро дар марҳилаи компиляция санҷида, аз ClassCastException дар вақти иҷроӣ пешгирӣ мекунад.
  • Бартараф кардани ниёз ба табдиди навъҳо: Нест ниёз ба табдиди дастӣ дар вақти гирифтани унсурҳо аз коллексияҳо.
  • Эҷоди коди бештар флексибл ва такрорӣ: Мумкин аст алгоритмҳо ва структураҳои маълумотро навъҳои гуногун истифода бурда нависед.

Масали бе Generics:

// Пеш аз Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // бе типгузорӣ
        list.add("hello");
        list.add(123); // метавонад ҳар гуна объект илова кунад

        String s = (String) list.get(0); // ниёз ба табдиди навъ
        Integer i = (Integer) list.get(1); // ниёз ба табдиди навъ

        // Хатогии табдиди навъ
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Масали бо Generics:

// Бо истифодаи Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // рӯйхати сатрҳо
        list.add("hello");
        // list.add(123); // хатогии компиляция - илова кардан мумкин нест Integer

        String s = list.get(0); // ниёз ба табдиди навъ нест

        // Нест мумкин илова кардани навъи дигар, пешгирӣ хатогиро
        // List<Integer> intList = new ArrayList<>();
        // intList.add("world"); // хатогии компиляция
        System.out.println(s);
    }
}

Generics инчунин дар:

  • Классҳо: ArrayList<E>, HashMap<K, V>
  • Интерфейсҳо: List<E>, Map<K, V>
  • Усулҳо: <T> void printArray(T[] array)
  • Маҳдудиятҳои навъҳо: <T extends Comparable<T>> (маҳдудият ба навъҳое, ки Comparable-ро иҷро мекунанд)

Реализацияи Generics дар Java асос ёфтааст ба "стирани навъҳо" (type erasure) дар марҳилаи компиляция. Ин маъно дорад, ки маълумоти дар бораи навъҳои генерикӣ нест карда мешавад, ва дар вақти иҷроӣ JVM бо навъҳои хом кор мекунад. Ин таъмини ҳамоҳангии пасзамарг бо версияҳои кӯҳнаи Java, аммо баъзе маҳдудиятҳоро дорад.