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, аммо баъзе маҳдудиятҳоро дорад.