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

Быстрый вопрос Java: выбор массива объектов в массив моего предполагаемого класса

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

private HashSet Data;

...

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

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

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

Я не понимаю, как работает механизм кастинга (или что бы это ни было).

4b9b3361

Ответ 1

Потому что toArray() создает массив объекта, и вы не можете сделать 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 позже

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

Ответ 2

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