En este momento, no tengo:Java: cómo implementar `` toArray` para Collection`
public <T> 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;
}
(Tenga en cuenta que esto no se sigue el contrato como se señaló por axtavt.)
donde consigo esta advertencia:
Type safety: Unchecked cast from capture#2-of ? to T
¿sigue siendo la mejor manera/más directa para implementarla? ¿Puedo de alguna manera codificarlo de una manera sin esa advertencia? ¿Cómo lo implementaría de otra manera?
Editar: Mi solución actual. Primero, realmente quería no tener esa advertencia en el toArray
. Por lo tanto, codifiqué estas funciones poco cooperadoras (read here para una mayor discusión sobre estos):
@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);
}
Ahora, mi toArray
aplicación se parece a:
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;
}
¿Quieres una colección en la firma en alguna parte? –
Todo lo que puede hacer es convertirlo a (T), el método de conversión() solo cambia el tipo de referencia, no cambiará el tipo de objeto al que se hace referencia. –