Подтвердить что ты не робот

Java Convert Generic LinkedList для общего массива

Итак, для начинающих скажем, что у меня есть LinkedList<String>,

Я могу легко преобразовать его в массив через toArray(). то есть.

LinkedList<String> strList = new LinkedList<String>();
String[] strArray = strList.toArray(new String[0]);

Но скажу, что у меня есть LinkedList<T> Тогда я следующий код:

LinkedList<T> tList = new LinkedList<T>();
T[] strArray = tList.toArray(new T[0]);

Я получаю Не могу создать общий массив сообщений об ошибках T.

Как я могу обойти это?

В частности, в моем классе у меня есть LinkedList<AbstractNode<T>> nodes, и я пытаюсь реализовать метод getAll(), который возвращает все узлы в виде массива.
Спасибо!

Примечание Ответ Péter Török дает правильный ответ на мою проблему, но для меня просто возврат ArrayList вместо [], как упоминалось в Bar, в конечном итоге сильно сгладил мой код.
Примечание2, немного посмотрев на мой код, я даже не уверен, что для начала нужно было преобразовать, LinkedList был в порядке для того, что я пытался сделать...:/

4b9b3361

Ответ 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 преобразует коллекцию в массив [...]

[...] наивный метод преобразования коллекции в массив не будет работать. Первое исправление, которое мы могли бы попробовать, это добавить неконтролируемый отбор, но мы вскоре увидим, что это приводит к еще более запутанным проблемам. Правильное исправление потребует от нас рефлексии.

Ответ 2

Так как Java generic действительно заменяет ваш T типом object и литой на конкретный тип, разрешенным при компиляции, можно создать List<T>, но не T[]. (Первый будет списком объектов, второй неизвестен) Отражение луча позволяет вам делать много уродливых хаков. Вы можете использовать их. Лично я использую их только в том случае, если нет других способов сделать что-то. Мне не нравятся ошибки времени выполнения.

Но мой вопрос: вам действительно нужно T[], почему бы вам не использовать ArrayList<T> вместо этого?