Массив контейнеров ассоциированный тип данных элемент, сохранившийся во время выполнения. Если вы создаете массив объектов, а затем добавить строки, этот объект не будет колдовать к String []:
Object[] objArr = new Object[] {"a", "b"};
String[] strArr = (String[]) objArr; //Produces ClassCastException
Вы также можете заметить, как это свойство используется массив во время выполнения, когда вы добавляете товар несоответствующего типа в массив:
String[] strArr = new String[] {"a", "b"};
Object[] objArr = (Object[]) strArr; //Legal this time
objArr[0] = 15; //Produces ArrayStoreException
аргументы родового типа стираются во время выполнения, поэтому JVM не знает, что конкретный тип массива для создания во время выполнения при вызове ToArray().
тип стирание - причина. java не знает, что T во время выполнения, поэтому он не может создать массив соответствующего типа. Другой, «типичный» вариант toArray требует массива «prototype» с правильным типом (который фиксируется во время компиляции!), Который он может копировать. – Pyranja
Это исторический. Метод предшествует дженерикам и хранится в его существующей форме, чтобы не нарушать устаревший код. – Perception
Я не уверен в этом. Я не вижу способа получить класс 'E' в этом методе. –