Я иногда слышал, что с дженериками Java не понял это правильно. (ближайшая ссылка, здесь )
Простите мою неопытность, но что сделало бы их лучше?
Java не применяет Generics во время выполнения, только во время компиляции.
Это означает, что вы можете делать интересные вещи, такие как добавление неправильных типов в общие коллекции.
Если вы слушаете Java Posse # 279 - Интервью с Джо Дарси и Алексом Бакли , они говорят об этой проблеме. Это также ссылка на пост в блоге Нила Гафтера под названием Reified Generics для Java , в котором говорится:
Многие люди недовольны ограничения, вызванные способом дженерики реализованы на Java. В частности, они недовольны тем, что параметры универсального типа не Reified: они не доступны в во время выполнения. Дженерики реализованы используя стирание, в котором общий тип параметры просто удаляются при во время выполнения.
Этот пост в блоге ссылается на более старую запись, Puzzling Through Erasure: раздел ответов , в которой подчеркивается точка в совместимости миграции в требованиях.
Цель состояла в том, чтобы обеспечить назад совместимость как источника, так и код объекта, а также миграция совместимость.
Обобщения Java только во время компиляции и скомпилированы в неуниверсальный код. В C # фактический скомпилированный MSIL является универсальным. Это имеет огромное значение для производительности, потому что Java все еще преобразуется во время выполнения. Подробнее см. Здесь .