Tengo dificultades para digerir este bloque de código en particular del método java.util.PriorityQueue#initElementsFromCollection .
/** * Initializes queue array with elements from the given Collection. * * @param c the collection */ private void initFromCollection(Collection<? extends E> c) { initElementsFromCollection(c); heapify(); } private void initElementsFromCollection(Collection<? extends E> c) { Object[] es = c.toArray(); int len = es.length; if (c.getClass() != ArrayList.class) es = Arrays.copyOf(es, len, Object[].class); if (len == 1 || this.comparator != null) for (Object e : es) if (e == null) throw new NullPointerException(); this.queue = ensureNonEmpty(es); this.size = len; } Puedo entender que el código aquí intenta construir el montón a partir de los elementos de la colección proporcionados a través del constructor, pero ¿por qué están comprobando el tipo de clase del argumento de la Collection contra ArrayList y copiando nuevamente los elementos, ya se ha copiado en Object[] es usando toArray ?
if (c.getClass() != ArrayList.class) es = Arrays.copyOf(es, len, Object[].class); ¿Sucede algo mágico en java.util.Arrays#copyOf(U[], int, java.lang.Class<? extends T[]>) ?
java-11