Изменения

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

Generics

633 байта добавлено, 19:03, 4 сентября 2022
м
rollbackEdits.php mass rollback
Это одна из самых важных вещей, которую вы должны узнать о 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(j, temp);
}
 
 
== Ограничения Generic ==
== Пример Преобразование типов ==В 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.
while(i.hasNext()) {
Integer next = '''(Integer)''' i.next();
if (next.compareTo(resultmax) > 0) {
max = next;
}
while(i.hasNext()) {
Integer next = i.next();
if (next.compareTo(resultmax) > 0) {
max = next;
}
1632
правки

Навигация