Quiero crear un método de ayuda que recibe Collection
parámetro de tipo para devolver una lista. Esto es lo que tengo ahora:
public class Helper {
public static <T> T[] CollectionToArray(Collection<T> collection) {
return collection.stream().toArray(Object[]::new); // Error
}
public static <T> T[] ListToArray(List<T> list) {
return list.stream().toArray(Object[]::new); // Error
}
}
public class IamSoNoob {
public void PleaseHelpMe() {
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
String[] arrayFromList = Helper.CollectionToArray(list); // Error
String[] arrayFromSet = Helper.CollectionToArray(set); // Error
String[] array = Helper.ListToArray(list); // Error
}
}
Mis preguntas son:
- ¿Es posible completar
CollectionToArray(Collection<T>)
?- ¿Si es así, cómo?
- Además, es posible pasar
List
ySet
como un parámetro en el primer lugar?
- ¿Es posible completar
ListToArray(List<T> list)
?- ¿Si es así, cómo?
Pero aquí hay algunas restricciones debido a mi gusto personal.
- No quiero usar
@SuppressWarnings
- Realmente quiero mantener la parte
.stream().toArray(Object[]::new)
(Java 8 parte!)
Y tengo la sensación de que tengo que arreglar la parte Object[]::new
mediante el uso de algo así como: <T extends Object>
o <? extends T>
pero no puedo averiguar.
Por favor, ayúdame a salir, y por favor, dar una explicación, así, a menudo me confundo Generic
y ?
.
No, usted no puede hacerlo, si fuera posible, el método de biblioteca Collection.toArray()
te habría dado el mismo tipo que el LHS pero en cambio cuando se desea que el tipo exacto como sus LHS tiene que usar Collection.toArray(T[])
(aun que viene con ArrayStoreExceptions
es decir, es de hasta al programador para proporcionar el tipo correcto de la matriz), la razón es que en tu toArray()
has especificado Object[]
para ser su matriz y después no puede echarlo a cualquier otro tipo o de lo contrario resultará en una ClassCastException
.
La razón de todo esto alboroto es debido a la forma de genéricos obras es decir, su cosa un tiempo de compilación y en tiempo de ejecución de Java borra todos los parámetros de tipo a sus tipos de límite superior y por lo tanto la pérdida de información de tipo que se requiere para la creación de matrices.
Una forma segura de hacerlo es mediante la adición de otro parametro a usted como ayudante método
public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {
return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));
}
y que sirva como
String[] arrayFromList = Helper.CollectionToArray(list, new String[0]);
pero de entonces todo el mundo mejor de usar Collection#toArray(T[])
.