Java: как реализовать `toArray` для` Collection`

Прямо сейчас у меня есть:

    public  T[] toArray(T[] old) {
        T[] arr = Arrays.copyOf(old, old.length + size());
        int i = old.length;
        for(E obj : this) {
            arr[i] = old.getClass().getComponentType().cast(obj);
            ++i;
        }
        return arr;
    }

(Обратите внимание, что это не соответствует контракту, как было указано axtavt.)

где Я получаю предупреждение:

Type safety: Unchecked cast from capture#2-of ? to T

Это все еще лучший / самый простой способ его реализации? Могу ли я как-то закодировать это без предупреждения? Как бы я мог это реализовать в противном случае?


Изменить: Мое текущее решение. Во-первых, мне очень хотелось, чтобы такое предупреждение не было в самом toArray . Поэтому я закодировал эти маленькие вспомогательные функции ( прочтите здесь , чтобы подробнее обсудить их):

@SuppressWarnings("unchecked") static  Class classOf(T obj) {
    return (Class) obj.getClass();
}

@SuppressWarnings("unchecked") static  Class classOf(T[] array) {
    return (Class) array.getClass().getComponentType();
}

@SuppressWarnings("unchecked") static  T[] newArray(Class clazz, int size) {
    return (T[]) Array.newInstance(clazz, size);
}   

Теперь моя реализация toArray выглядит так:

    public  T[] toArray(T[] array) { 
        int size = size();
        if (array.length < size) { 
            array = newArray(classOf(array), size);
        } else if (array.length > size) {
            array[size] = null;
        }

        int i = 0;
        for (E e : this) {
            array[i] = classOf(array).cast(e);
            i++;
        }
        return array;
    } 

8
задан Community 23 May 2017 в 11:47
поделиться