Приведение массива объектов в массив моего предполагаемого класса - PullRequest
28 голосов
/ 27 декабря 2008

Просто для ознакомления, может кто-нибудь быстро объяснить, что мешает этому работать (при компиляции):

private HashSet data;

...

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray();
}

... и что делает так, как работает:

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}

Мне не совсем понятен механизм работы с кастингом (или чем-то еще), который делает это так.

Ответы [ 2 ]

38 голосов
/ 27 декабря 2008

Потому что toArray() создает массив Object, и вы не можете превратить Object[] в DataObject[], просто приведя его. toArray(DataObject[]) создает массив DataObject.

И да, это недостаток класса Collections и то, как Generics были включены в Java. Вы ожидаете, что Collection<E>.toArray() может вернуть массив E, но это не так.

Интересная вещь в вызове toArray(DataObject[]): вам не нужно делать массив "a" достаточно большим, поэтому вы можете вызывать его с помощью toArray(new DataObject[0]), если хотите.

Называть его как toArray(new DateObject[0]) на самом деле лучше, если вы используете .length позже, чтобы получить длину массива. если начальная длина была большой и был возвращен тот же самый массив объектов, который вы передали, то вы можете столкнуться с NullPointerException s позже

Ранее я задавал вопрос о дженериках Java, и мне было указано на этот FAQ, который был очень полезен: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

3 голосов
/ 27 декабря 2008

Чтобы обеспечить безопасность типов при приведении массива, как вы предполагали (DataObject[] dataArray = (DataObject[]) objectArray;), JVM должна будет проверять каждый отдельный объект в массиве, поэтому на самом деле это не простая операция, подобная приведению типа. Я думаю, именно поэтому вы должны передать экземпляр массива, который затем заполняет операция toArray().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...