Метод с toArray будет возвращать Object [], а не T [] [duplicate]

У меня есть python 2.73 и windows 7. Решение, которое сработало для меня, было:

  1. Добавлен каталог bin mingw32 в переменную окружения: добавьте PATH с C:\programs\mingw\bin;
  2. Созданный distutils.cfg, расположенный в C:\Python27\Lib\distutils\distutils.cfg, содержащий:
    [build]
    compiler=mingw32
    

Чтобы иметь дело с MinGW, который больше не распознает флаг -mno-cygwin, удалите флаг в C: \ Python27 \ Lib \ distutils \ cygwincompiler.py с 322 по 326, поэтому он выглядит так:

  self.set_executables(compiler='gcc -O -Wall',
                         compiler_so='gcc -mdll -O -Wall',
                         compiler_cxx='g++ -O -Wall',
                         linker_exe='gcc',
                         linker_so='%s %s %s'
                                    % (self.linker_dll, shared_option,
                                       entry_point))
28
задан ThinkingStiff 29 June 2012 в 08:34
поделиться

5 ответов

Вам нужно передать массив, поэтому его тип выполнения можно использовать как подсказку toArray. Вместо этого попробуйте toArray(new String[0]). Вы также можете передать массив предварительно заданного размера.

Чтобы понять, подумайте, какое стирание стилей нужно будет сделать, чтобы

new T[4]

работал. Если Java допускает, что лучшее, что может сделать post erasure, это

new Object[4]

. Большинство реализаций toArray используют java.lang.reflect.Array для построения выходного массива правильного типа с учетом тип подсказки, переданный как Class.

21
ответ дан Mike Samuel 24 August 2018 в 18:52
поделиться

Обходным путем будет использование:

       List<String> list = new ArrayList<>();
         list.add("Sputnik");
         list.add("Explorer");

        //String[] str = list.toArray(); 

Это связано с тем, что он бросает несовместимые типы: Object [] не может быть преобразован в String [] error

       Instead use:

        String[] str = list.toArray(new String[0]);
        or
        String[] str = list.toArray(new String[list.size()]);
1
ответ дан Ajay Vijayasarathy 24 August 2018 в 18:52
поделиться

Чтобы понять, почему это происходит, просто посмотрите на javadoc для Collection.toArray() , а затем посмотрите на метод Collection.toArray(T[] a) . Также имейте в виду, что дженерики в Java стираются во время выполнения.

3
ответ дан Costi Ciudatu 24 August 2018 в 18:52
поделиться

Поскольку массивы были в Java с самого начала, в то время как generics были введены только в Java 5. И метод List.toArray() был введен в Java 1.2 до того, как появились дженерики, и поэтому было указано, что он возвращает Object[]. Многие существующие коды теперь ожидают, что List.toArray() вернет Object[], поэтому его теперь нельзя изменить.

Кроме того, генераторы стираются во время выполнения, поэтому ArrayList не может даже построить массив нужного типа, если он захочет.

Лазейкой для этого является метод List.toArray(T[]) , который вернет вам массив правильного типа, если вы дадите ему массив правильного типа, чтобы он знал, какой тип использовать.

13
ответ дан Daniel Pryden 24 August 2018 в 18:52
поделиться

Причины два:

  1. Метод предшествовал Generics, и они не могли изменить подпись, не нарушая обратной совместимости.
  2. В любом случае, поскольку List построено без Class<T>, нет возможности для реализации построить массив типа T.
1
ответ дан user207421 24 August 2018 в 18:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: