Почему разрешается использовать heap.toArray (new int [0] [0])? - PullRequest
0 голосов
/ 24 февраля 2019

Я видел код, подобный следующему:

public int[][] test() {
       Queue<Integer> queue = new PriorityQueue<>();
       //Do Something 
       return queue.toArray(new int[0][0])
}

Мне интересно узнать последнюю строку, почему здесь разрешено int[0][0]?Разве аргумент метода queue.toArray не должен быть памятью, в которую восстановлен массив?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Разве аргумент метода 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, который былдействует с более ранними выпусками.

0 голосов
/ 24 февраля 2019

Документация toArray находится здесь: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#toArray(T[])

toArray подпись <T> T[] toArray(T[] a).Таким образом, компилятор выводит T = int[].Обратите внимание, что параметром типа коллекции является E, а не T.

Независимо от того, что этот код предназначен для выполнения, скорее всего, это не удастся, поскольку документация гласит:

Броски: ArrayStoreException- если тип времени выполнения указанного массива не является супертипом типа времени выполнения каждого элемента в этой коллекции

И int[] не является супертипом Integer.

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