Официальный Java учебник по дженериков объясняет тип стиранию и почему он был добавлен в компиляторе:
Когда создается универсальный тип, компилятор переводит эти типы с помощью метода, называемого стиранием типа, - процесс, в котором компилятор удаляет всю информацию, связанную с параметрами типа и аргументами типа, внутри класса или метода. Стирание типа позволяет приложениям Java, использующим обобщенные элементы, поддерживать двоичную совместимость с библиотеками Java и приложениями, которые были созданы до использования обобщенных типов.
Скорее всего, это был прагматичный подход или, возможно, наименее болезненный. Однако теперь, когда дженерики широко поддерживаются в отрасли, что можно сделать, чтобы нам не требовалось стирание типов? Это возможно без необходимости обратной совместимости или, если это возможно, практично?
Последнее утверждение в приведенной выше цитате стало ссылаться на себя? То есть: «стирание типов позволяет приложениям Java, использующим универсальные средства, поддерживать двоичную совместимость с библиотеками Java и приложениями, которые были созданы с версиями Java, которые выполняют стирание типов».
Ответы:
Окончание срока службы относится к Java Development Toolkit и Java Runtime Environment. И только версии Oracle (Sun). Но это не относится к приложениям, написанным третьими лицами. Намерение состоит в том, чтобы никогда не нарушать код, который когда-либо выполнялся на JVM, поэтому вряд ли Java когда-либо перестанет выполнять стирание типов.
Конечно, C # также вводил дженерики в более поздней версии обратно совместимым образом без стирания типов, но это в основном означало дублирование всех классов коллекции. Я полагаю, что разработчики Java не хотят этого делать, и поэтому они выбрали в первую очередь стирание типов. Без типов значений преимущество не стертых дженериков не так велико.
источник
List<int>
бы, что, вероятно, сделает рабочие нагрузки намного эффективнее текущихList<Integer>
.