@ Лукас, относительно: «new E []»
Новый E [0] вызвал ошибку компилятора, как вы, вероятно, ожидали.Обходной путь, который я нашел:
final E [] returnArray = (E []) events.toArray (new Event [events.size ()]);
NB код находится в шаблоне класса Listener.
В моем обходном решении стирание типов - это и проблема, и решение.Приведение к (E []) безопасно, поскольку его точный тип стирается в Event [].Единственным недостатком, который я вижу, является предупреждение компилятора о «непроверенных или небезопасных операциях» (что, очевидно, приведение не в данном случае относится к стиранию типа).
@ Lukas, относительно обратной совместимости
Я не вижу большой проблемы с обратной совместимостью.Делать возвращаемый тип более особенным - это не то же самое, что делать тип аргумента более особенным.
Другими словами, исходный код, который до сих пор ожидал, что Collection.toArray () вернет Object [], должен быть совершенно счастливвместо этого получите E [].
А что касается байт-кода, Object [] и E [] в любом случае одинаковы из-за стирания типа.