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
}