Нет, вы абсолютно не можете этого сделать, если бы было возможно, что библиотечный метод Collection.toArray()
дал бы вам тот же тип, что и ваш LHS, но вместо этого, когда вы хотите указать точный тип как ваш LHS, вы должны использовать Collection.toArray(T[])
(даже если он идет с ArrayStoreExceptions
, т.е. программист должен предоставить правильный тип для массива), причина в том, что в вашем toArray()
вы указали Object[]
в качестве массива, и позже вы не можете привестиэто к любому другому типу, иначе это приведет к ClassCastException
.
Причина всего этого hullabaloo заключается в том, как работают дженерики, т. е. во время компиляции, а во время выполнения Java стирает все параметры типа вих верхние границы типов и, следовательно, потеря информации о типах, которая требуется для создания массивов.
Один из безопасных способов сделать это - добавить другой параметр к вашему вспомогательному методу как
public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {
return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));
}
и использовать егокак
String[] arrayFromList = Helper.CollectionToArray(list, new String[0]);
но тогда всем лучше использовать Collection#toArray(T[])
.