ArrayList.toArray () не преобразовывает в правильный тип? - PullRequest
2 голосов
/ 24 октября 2011

Итак, я получил:

class BlahBlah
{
    public BlahBlah()
    {
        things = new ArrayList<Thing>();
    }

    public Thing[] getThings()
    {
        return (Thing[]) things.toArray();
    }

    private ArrayList<Thing> things;
}

В другом классе я получил:

for (Thing thing : someInstanceOfBlahBlah.getThings())
{
    // some irrelevant code
}

И ошибка:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LsomePackage.Thing;
at somePackage.Blahblah.getThings(Blahblah.java:10)

Какя могу решить эту проблему?

Ответы [ 4 ]

8 голосов
/ 24 октября 2011

Попробуйте:

public Thing[] getThings()
{
    return things.toArray(new Thing[things.size()]);
}

Причина, по которой ваша оригинальная версия не работает, состоит в том, что toArray() возвращает Object[], а не Thing[].Вам нужно использовать другую форму toArray - toArray(T[]) - чтобы получить массив Things.

4 голосов
/ 24 октября 2011

Попробуйте

private static final Thing[] NO_THING = {};

и

return (Thing[]) things.toArray(NO_THING);
0 голосов
/ 24 октября 2011

try

things.toArray(new Thing[0])

List.toArray javadoc

0 голосов
/ 24 октября 2011

Есть 2 функции toArray () .

    Object[] toArray()
        Returns an array containing all of the elements in this list in the correct order.
    <T> T[] toArray(T[] a)
        Returns an array containing all of the elements in this list in the correct order;
        the runtime type of the returned array is that of the specified array.

Вы используете первую, которая должна возвращать Object[], и она делает это.Если вы хотите получить правильный тип, используйте вторую версию:

things.toArray(new Thing[things.length]);

или если вы не хотите тратить больше места на new Thing[things.length], просто измените цикл на:

Thing thing = null;
for (Object o : someInstanceOfBlahBlah.getThings())
{
    thing = (Thing) o;
    // some unrelevant code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...