Изменения

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

Generics

2206 байт добавлено, 06:37, 8 октября 2013
Проблемы реализации Generics
Но все равно после выполнение останется ошибка в третей строчке :
addAll(new Object[10], new ArrayList<String>()); // '''Ошибка'''
 
----
Проблема в том что две Коллекции могут быть разных типов (несовместимость generic-типов). Для таких случаев было придуман Bounded type argument. Он нужен если метод ,который мы пишем использовал бы определенный тип данных. Для этого нужно ввести <N extends M> (N принимает только значения M).
Также можно корекнно корректно писать <T extends A & B & C>. (Принимает значения нескольких переменных)
* '''Решение'''
----
 
* Решение 5 – '''Lower bounded wcard'''
Реализуем метод нахождение максимума в коллекции.
 
* '''Проблема'''
<T extends Comparable<T>>
T max(Collection<T> c) {
}
 
List<Integer> il; Integer I = max(il);
class Test implements Comparable<Object> {…}
List<Test> tl; Test t = max(tl); // Ошибка
 
* <T extends Comparable<T>> обозначает что Т обязан реализовывать интерфейс Comparable<T>.
Ошибка возникает из за того что Test реализует интерфейс Comparable<Object>. Решение этой проблемы - Lower bounded wcard("Ограничение снизу"). Суть в том что мы будет реализовывать метод не только для Т, но и для его Супер-типов(Родительских типов).
Например: Если мы напишем
 
List<T super Integer> list;
 
Мы можем заполнить его List<Integer>, List<Number> или List<Object>.
* '''Решение'''
 
<T extends Comparable<? super T>>
T max(Collection<T> c) {
}
----
* Решение 6 – '''Wildcard Capture'''
Реализуем метод Swap в List<?>
 
* '''Проблема'''
 
void swap(List<?> list, int i, int j) {
list.set(i, list.get(j)); // Ошибка
}
 
Проблема в том, что метод List.set() не может работать с List<?>, так как ему не известно как он List. Для решение этой проблемы используют "Wildcard Capture" (или "Capture helpers"). Суть заключается в том, чтобы обмануть компилятор напишем еще один метод с параметризованной переменной и будем его использовать внутри нашего метода.
 
* '''Решение'''
 
void swap(List<?> list, int i, int j) {
swapImpl(list, i, j);
}
<T> void swapImpl(List<T> list, int i, int j) {
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
== Источники ==
Анонимный участник

Навигация