Middle
Какво са Generics и за какво се използват?
sobes.tech AI
Отговор от AI
Генериците в 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("здравей");
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("здравей");
// list.add(123); // грешка при компилация - не може да добави Integer
String s = list.get(0); // без нужда от преобразуване
// Не е възможно да добавите друг тип, предотвратява грешки
// List<Integer> intList = new ArrayList<>();
// intList.add("свят"); // грешка при компилация
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, но има някои ограничения.