Sobes.tech
Middle

Дар Generics чӣ имкониятҳо ҳастанд؟

sobes.tech AI

Ҷавоб аз AI

Генерикҳо имкон медиҳанд, ки синфҳо, интерфейсҳо ва методҳоро параметрӣ созем.

Вазифаҳои асосӣ:

  • Истифодаи такрорӣ: Таҳия кардани структураҳои умумӣ ва алгоритмҳо, ки бо ҳар гуна намудҳо кор мекунанд.
  • Бехатарии намудҳо дар вақти компиляция: Хатогиҳои намудҳо дар марҳилаи компиляция ошкор мешаванд, на дар вақти иҷро. Ин ниёз ба табдид кардани намудҳо ва хатогиҳои эҳтимолии ClassCastException-ро бартараф мекунад.
  • Дидани беҳтаршуда: Код равшантар мешавад, зеро равшан нишон медиҳад, бо кадом намудҳо кор мекунад.

Маслиҳатҳо:

  • Синфи-контейнер List<T> метавонад элементҳои ҳар гуна намудро нигоҳ дорад.
  • Метод static <T> T getFirst(List<T> list) метавонад аввалин элементро аз рӯйхати ҳар гуна намуд баргардонад.

Маҳдудиятҳои Generics:

  • Нест метавонад намунаи намудҳои умумиро созад: new T().
  • Нест метавонад намудҳои primitives-ро ҳамчун параметр истифода барад (масалан, List<int> - нодуруст, бояд List<Integer>).
  • Нест метавонад массивҳои намудҳои умумиро мустақиман созад (масалан, T[] array = new T[10] - нодуруст, бояд истифода бурд ArrayList ё табдид кардани намудҳо).
  • Нест метавонад майдонҳои статикӣ-ро мустақиман истифода барад.
  • Маълумот дар бораи намудҳо дар марҳилаи иҷро (Type Erasure) нест мешавад, ба истиснои wildcards-ҳои маҳдуд.

Wildcards ва Bounded Type Parameters:

  • <?>: Номаълуми намуд. Имкон медиҳад, ки элементҳоро хонем, аммо нависем наметавонем.
  • <? extends T>: Маҳдудияти болоӣ. Имкон медиҳад, ки бо намудҳое кор кунем, ки подтипҳои T мебошанд. Мумкин аст, элементҳои T ё намудҳои супертипро хонем, аммо навиштан наметавонем (ғайр аз null).
  • <? super T>: Маҳдудияти поёнӣ. Имкон медиҳад, ки бо намудҳое кор кунем, ки супертипҳои T мебошанд. Мумкин аст, элементҳои T ё подтипҳои онро нависем, аммо танҳо элементҳои Object-ро хонем.

Масалан:

// Метод, ки метавонад элементҳоро аз ҳар рӯйхати, ки подтипҳои Number дорад, чоп кунад
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Хатои компиляция
}

// Метод, ки метавонад Integer-ро ба рӯйхат, ки Integer ё супертипҳои онро дорад, илова кунад
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Хатои компиляция, баргардонидани Object
}