Прямо сейчас у меня есть:
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 extends T> classOf(T obj) {
return (Class extends T>) obj.getClass();
}
@SuppressWarnings("unchecked") static Class extends T> classOf(T[] array) {
return (Class extends T>) 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;
}