Ответ 1
Обходной путь, который используется в библиотеке классов, будет (с использованием непроверенного перевода)
public <T> T[] toArray(List<T> list, T[] a) {
if (a.length < list.size()) {
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), list.size()));
}
return list.toArray(a);
}
или с параметром Class
вместо массива:
public <T> T[] toArray(List<T> list, Class<T> k) {
return list.toArray(
(T[])java.lang.reflect.Array.newInstance(k, list.size()));
}
Из Java Общие и Коллекции, главы 6.4-5.
Невозможность создания общих массивов является одним из самых серьезных ограничений в Java. Поскольку это так раздражает, стоит повторить причину, по которой это происходит: общие массивы являются проблематичными, потому что генерики реализуются посредством стирания, но стирание выгодно, потому что оно облегчает эволюцию.
Лучшим обходным решением является использование
ArrayList
или какого-либо другого класса из Framework Collections, предпочитающего массив. Мы обсудили компромиссы между классами коллекций и массивами в Разделе 2.5, и мы отметили, что во многих случаях коллекции предпочтительнее массивов: поскольку они усваивают больше ошибок во время компиляции, потому что они обеспечивают больше операций и потому, что они предлагают большую гибкость в представлении. Безусловно, лучшим решением проблем, предлагаемых массивами, является "просто сказать" нет ": используйте коллекции, предпочитая массивы.Иногда это не сработает, потому что вам нужен массив по соображениям совместимости или эффективности. Примеры этого встречаются в Framework Collections: для совместимости метод toArray преобразует коллекцию в массив [...]
[...] наивный метод преобразования коллекции в массив не будет работать. Первое исправление, которое мы могли бы попробовать, это добавить неконтролируемый отбор, но мы вскоре увидим, что это приводит к еще более запутанным проблемам. Правильное исправление потребует от нас рефлексии.