Изменения

Перейти к: навигация, поиск

Generics

1669 байт добавлено, 14:56, 1 июня 2021
Проблемы реализации Generics
Это одна из самых важных вещей, которую вы должны узнать о Generics
Как говоритьсяговорится: "В бочке мёда есть ложка дегтя". Для того чтобы сохранить целостности и независимости друг от друга Коллекции, у Generics существует так называемая "Несовместимость generic-типов".
* Суть такова:
Проблема в том что эта реализация кода не эффективна, так как Collection<Object> не является полностью родительской коллекцией всех остальных коллекции, грубо говоря Collection<Object> имеет ограничения.
Для решения этой проблемы используется Wildcard ("?"). Он не имеет ограничения в использовании(то есть имеет соответствие с любым типом) и в этом его плюсы. И теперь, мы можем назвать это вызвать dump с любым типом коллекции.
* '''Решение'''
List<Circle> l; draw(l); // '''Ошибка'''
Проблема в том, что у нас не получиться получится из-за несовместимости типов.
Предложенное решение используется, если метод который нужно реализовать использовал бы определенный тип и его подтипов. Так называемое "Ограничение сверху". Для этого нужно вместо <Shape> прописать <? extends Shape>.
}
}
Но все равно после выполнение останется ошибка в третей третьей строчке :
addAll(new Object[10], new ArrayList<String>()); // '''Ошибка'''
}
Проблема в том, что метод List.set() не может работать с List<?>, так как ему не известно как какой он List. Для решение этой проблемы используют "Wildcard Capture" (или "Capture helpers"). Суть заключается в том, чтобы обмануть компилятор напишем . Напишем еще один метод с параметризованной переменной и будем его использовать внутри нашего метода.
* '''Решение'''
list.set(i, list.get(j));
list.set(j, temp);
}
 
== Ограничения Generic ==
Также нужно запомнить простые правила для работы с Generics.
 
* Невозможно создать массив параметра типа
Collection<T> c;
T[] ta;
new T[10]; // Ошибка !!
 
* Невозможно создать массив Generic-классов
new ArrayList<List<Integer>>();
List<?>[] la = new List<?>[10]; // Ошибка !!
 
 
== Преобразование типов ==
В Generics также можно манипулировать с информацией, хранящийся в переменных.
 
* Уничтожение информации о типе
 
List l = new ArrayList<String>();
 
* Добавление информации о типе
 
List<String> l = (List<String>) new ArrayList();
List<String> l1 = new ArrayList();
 
== Примеры кода ==
* Первый пример:
List<String> ls;
List<Integer> li;
ls.getClass() == li.getClass() // True
ls instanceof List // True
ls instanceof List<String> // Запрещено
 
* Второй пример:
 
Нахождение максимума в Коллекции Integer.
 
* Без Generics:
Collection c;
Iterator i = c.iterator();
Integer max = '''(Integer)''' i.next();
while(i.hasNext()) {
Integer next = '''(Integer)''' i.next();
if (next.compareTo(max) > 0) {
max = next;
}
}
 
* С помощью Generics
Collection'''<Integer>''' c;
Iterator'''<Integer>''' i = c.iterator();
Integer max = i.next();
while(i.hasNext()) {
Integer next = i.next();
if (next.compareTo(max) > 0) {
max = next;
}
}
Анонимный участник

Навигация