До генерирования Java, Collection.toArray() не имел способа узнать, какой тип массива ожидал разработчик (особенно для пустой коллекции). Насколько я понимаю, это было основным аргументом в пользу идиомы collection.toArray(new E[0]).
С generics Collection<E>.toArray() может возвращать массив, полный экземпляров E и/или его специализаций. Интересно, почему тип возврата по-прежнему равен Object[], а не E[]. На мой взгляд, возврат E[] вместо Object[] не должен нарушать существующий код.
Смотрите: Collection.toArray(), Collection.toArray(T[]) и связанная с этим тема java: (String []) List.toArray() предоставляет ClassCastException