Разве аргумент метода queue.toArray не должен быть памятью, в которую восстановлен массив?
Не обязательно.
Что происходит, когда toArray
метод определяет, какой размер массива необходим для хранения содержимого коллекции.Если предоставленный массив достаточно велик, то именно туда записывается содержимое.В противном случае новый массив выделяется и используется.В последнем случае фактический тип массива аргументов определяет тип выделяемого массива.
Как отмечает @ReputationFarmer, в этом случае queue.toArray(new int[0][0])
, вероятно, даст исключение времени выполнения (ArrayStoreException
),Вызов должен быть queue.toArray(new Integer[0])
.
Причина, по которой это не приводит к ошибке компиляции, состоит в том, что сигнатура типа этого метода toArray
равна <T> T[] toArray(T[] a)
, что позволяет любой тип массива, который будет передан в качестве аргумента.
Итак ... почему они определили toArray
таким образом?
Ответ в историиJava:
Методы toArray
указаны в API Collection
, который был добавлен в Java в Java 1.2.
Из Java1.2 для Java 1.4.2, подпись для этого метода была:
public Object[] toArray(Object[] a)
Другими словами, вы можете передать массив любого ссылочного типа, и компилятор примет его.
В Java 5 они ввели дженерики и переопределили метод toArray
, чтобы иметь его текущую подпись.
Я подозреваю , что причиначто подпись toArray
не была переопределена так:
<T extends E> T[] toArray(T[] a)
, что она сломалась (с ошибками компиляции) для некоторого кода Java, который былдействует с более ранними выпусками.