Изменения
Generics
,→Проблемы реализации Generics
// ClassCastException
Integer li = lo.get(0);
== Проблемы реализации Generics ==
* Решение 1 - '''Wildcard'''
Пусть мы захотели написать метод, который берет Collection<Object> и выводит на экран. И мы захотели вызвать dump для Integer.
'''Проблема'''
}
}
----
* Решение 2 – '''Bounded Wildcard'''
Пусть мы захотели написать метод, который рисует List<Shape>. И у Shape есть наследник Circle.
И мы хотим вызвать draw для Circle. Но у нас не получиться из-за несовместимости типов.
'''Проблема'''
List<Circle> l; draw(l); // '''Ошибка'''
Это решение используют, если метод который нужно реализовать использовал бы определенный тип и его подтипов. Так называемое "Ограничение сверху". В Этом примере Circle является подтипом Для этого нужно вместо <Shape> прописать <? extends Shape>.
'''Решение'''
}
}
----
* Решение 3 – '''Generic-Метод'''
Пусть вы захотели сделать метод, который берет массив Object и переносить их в коллекцию.
'''Проблема'''
addAll(new String[10], new ArrayList<Object>()); // '''Ошибка'''
Напомним, что вы не можете просто засунуть Object в коллекции неизвестного типа. Способ решения этой проблемы является использование "Generic-Метод" Для этого перед методом нужно объявить <T> и использовать его. '''Решение'''
<T> void addAll(T[] a, Collection<T> c) {
for (int i = 0; i < a.length; i++) {