Middle
რა შესაძლებლობები არსებობს Generics-ში?
sobes.tech AI
პასუხი AI-სგან
Генериктер параметрленген класс, интерфейс жана метод түзүүгө мүмкүндүк берет.
Негизги мүмкүнчүлүктөр:
- Кодду кайра колдонуу: Ар кандай түрлөр менен иштей турган универсалдуу структуралар жана алгоритмдер түзүү.
- Типтин коопсуздугу компиляция учурунда: Тип каталары компиляция этабында аныкталат, аткаруу учурунда эмес. Бул ручной түр которуулары жана байланышкан потенциалдуу каталар
ClassCastExceptionболтурбайт. - Жөнөкөйлүк жана түшүнүктүүлүк: Код көбүрөөк түшүнүктүү болот, анткени ал иштеген типтерди так көрсөтөт.
Мисалдар:
List<T>классы кез келгенTтиптеги элементтерди сактай алат.static <T> T getFirst(List<T> list)методу кез келген типтеги биринчи элементти кайтарат.
Генериктердин чектөөлөрү:
- Жалпы типтин экземплярин түзүү мүмкүн эмес:
new T(). - Примитивдүү типтерди тип параметрлери катары колдонуу мүмкүн эмес (мисалы,
List<int>туура эмес, туурасыList<Integer>). - Жалпы типтеги массивдерди түзүү түздөн-түз мүмкүн эмес (мисалы,
T[] array = new T[10]туура эмес,ArrayListже типти которуу колдонуш керек). - Статикалык өрөөндөрдү түздөн-түз колдонуу мүмкүн эмес.
- Тип маалыматтары ишке ашырылуу учурунда жоголот (Type Erasure), bounded 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 кайтарат
}