Sobes.tech
Middle

რა შესაძლებლობები არსებობს Generics-ში?

sobes.tech AI

პასუხი AI-სგან

Генериктер параметрленген класс, интерфейс жана метод түзүүгө мүмкүндүк берет.

Негизги мүмкүнчүлүктөр:

  • Кодду кайра колдонуу: Ар кандай түрлөр менен иштей турган универсалдуу структуралар жана алгоритмдер түзүү.
  • Типтин коопсуздугу компиляция учурунда: Тип каталары компиляция этабында аныкталат, аткаруу учурунда эмес. Бул ручной түр которуулары жана байланышкан потенциалдуу каталар ClassCastException болтурбайт.
  • Жөнөкөйлүк жана түшүнүктүүлүк: Код көбүрөөк түшүнүктүү болот, анткени ал иштеген типтерди так көрсөтөт.

Мисалдар:

  • List<T> классы кез келген T типтеги элементтерди сактай алат.
  • static <T> T getFirst(List<T> list) методу кез келген типтеги биринчи элементти кайтарат.

Генериктердин чектөөлөрү:

  • Жалпы типтин экземплярин түзүү мүмкүн эмес: new T().
  • Примитивдүү типтерди тип параметрлери катары колдонуу мүмкүн эмес (мисалы, List<int> туура эмес, туурасы List<Integer>).
  • Жалпы типтеги массивдерди түзүү түздөн-түз мүмкүн эмес (мисалы, T[] array = new T[10] туура эмес, ArrayList же типти которуу колдонуш керек).
  • Статикалык өрөөндөрдү түздөн-түз колдонуу мүмкүн эмес.
  • Тип маалыматтары ишке ашырылуу учурунда жоголот (Type Erasure), bounded 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 кайтарат
}