Как функция toArray () гарантирует, что список длинных типов не может быть преобразован в массив Integer - PullRequest
0 голосов
/ 30 мая 2019
    public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
    }        

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

Не понимаю, почему третий тип параметра для функции copyOf () равен Class<? extends T[]>, а не просто Class<T[]>. В чем разница между ними здесь. Означает ли это ограничение, что один тип списка не может быть преобразован в другой тип массива.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Подстановочный знак позволяет передавать не-литеральные классы.

Например:

copyOf(new String[0], 0, String[].class);
copyOf(new String[0], 0, new String[0].getClass());

Оба они действительны, когда третий тип параметра равен Class<? extends T[]>;но только первое допустимо для Class<T[]>.

Ideone demo

На практике это означает, что вы можете вызвать copyOfдля типов, которые вы не знаете во время компиляции;вместо этого вы получаете класс из существующего массива.

0 голосов
/ 30 мая 2019

В java, массив равен ковариация

В Java Integer [] является подклассом Number [], и оба они являются подклассами Object []. Это называется ковариацией.

В вашем случае это означает, что он принимает весь массив, который является подтипом T в качестве параметра. Очевидно, более гибкий, чем T [].

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