Здесь , я задумался о том, как правильно реализовать Collection#toArray(T[] array)
.Меня больше всего раздражало, что array.getClass().getComponentType()
имеет тип Class<?>
, а не Class<? extends T>
, как я ожидал.
Поэтому я закодировал эти три функции:
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T obj) {
return (Class<? extends T>) obj.getClass();
}
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T[] array) {
return (Class<? extends T>) array.getClass().getComponentType();
}
@SuppressWarnings("unchecked") static <T> T[] newArray(Class<T> clazz, int size) {
return (T[]) Array.newInstance(clazz, size);
}
И затемМоя реализация toArray
выглядит следующим образом:
public <T> 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;
}
Что меня интересует сейчас:
Всегда ли безопасны эти 3 вспомогательные функции?Esp., Всегда ли приведение типов безопасно?
Почему эти функции еще не в Java?
Также см. Очень похожие вопросы: T obj
для универсального типа T
.Тип obj.getClass()
равен Class<?>
, а не Class<? extends T>
.Почему?