Middle
Šta su Generics i zašto se koriste?
sobes.tech АИ
Одговор од АИ
Generics у Јави омогућавају креирање класа, интерфејса и метода који раде са параметризованим типовима.
Главна сврха Generics:
- Повећање типске безбедности: Компилатор проверава типове током компилације, спречавајући
ClassCastExceptionтоком извршавања. - Уклањање кастовања типова: Нема потребе за ручним кастовањем приликом извлачења елемената из колекција.
- Креирање флексибилнијег и поновно коришћеног кода: Може се писати генерализовани алгоритми и структуре података применљиве на различите типове података.
Пример без Generics:
// Пре Јаве 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 у Јави заснована је на "стирању типова" (type erasure) у фази компилације. Ово значи да информације о генерисаним типовима бришу, а током извршавања ЈВМ ради са сирим типовима. Ово обезбеђује назадну компатибилност са старим верзијама Јаве, али има одређена ограничења.