Middle
Какви са възможностите в Generics?
sobes.tech AI
Отговор от AI
Обобщенията позволяват създаването на параметризирани класове, интерфейси и методи.
Основни възможности:
- Повторна употреба на кода: Създаване на универсални структури от данни и алгоритми, работещи с всякакъв тип.
- Безопасност на типовете по време на компилация: Грешките при типовете се откриват на етапа на компилация, а не при изпълнение. Премахва необходимостта от ръчни преобразувания и потенциални грешки
ClassCastException. - Подобрена четливост: Кодът става по-разбираем, тъй като ясно показва с кои типове работи.
Примери:
- Класът контейнер
List<T>може да съхранява елементи от всякакъв типT. - Методът
static <T> T getFirst(List<T> list)може да връща първия елемент от списък от всякакъв тип.
Ограничения на Generics:
- Не е възможно да се създават екземпляри на обобщени типове:
new T(). - Не може да се използват примитивни типове като параметри на тип (например,
List<int>- неправилно, трябва да се използваList<Integer>). - Не може да се създават масиви от обобщени типове директно (например,
T[] array = new T[10]- неправилно, трябва да се използваArrayListили преобразуване). - Не може да се използват статични полета на обобщени типове директно.
- Информацията за типовете се изтрива по време на изпълнение (Type Erasure), с изключение на ограничените wildcards.
Wildcards и ограничени параметри на типове:
<?>: Неизвестен тип. Позволява четене на елементи, но не и писане.<? 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
}