В Java, как мне преобразовать List<?>
в List<T>
с использованием метода общего назначения, чтобы я мог заменить шаблоны, подобные следующим, одним вызовом метода:
List untypedList = new ArrayList(); // or returned from a legacy method
List<Integer> typedList = new ArrayList<Integer>();
for (Object item: untypedList)
typedList.add((Integer)item);
Обратите внимание, что приведенный выше код не генерирует никаких предупреждений о типе безопасности и, в идеале, ваше решение также не должно генерировать никаких таких предупреждений.
Будет ли выполнено следующее решение, если в списке Class<L>
имеется стандартный конструктор по умолчанию?
public class ListUtil {
public static <T, L extends List<T>> L typedList(List<?> untypedList, Class<T> itemClass, Class<L> listClass) {
L list = null;
try {
list = listClass.newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
for (Object item: untypedList)
list.add(itemClass.cast(item));
return list;
}
}
(Обратите внимание, что listClass.newInstance()
выдает InstantiationException
или IllegalAccessException
, если экземпляр Class<L>
не имеет открытого конструктора по умолчанию. Какие проблемы могут возникнуть, если метод неправильно обрабатывает эти исключения?)
Примечания:
-
T
- это тип каждого элемента в результирующем списке. -
L
- это тип списка, который я хочу создать (который расширяетList<T>
). -
untypedList
- это "нетипизированный" список ввода, фактически тот же, что иList<Object>
. -
itemClass
представляет класс выполненияT
. -
listClass
представляет класс выполненияL
.