Я понимаю, что причина, по которой в Java есть исходные типы и стирание стилей, заключается в том, что, поскольку в то время были введены генерики, существовали стандартные API-интерфейсы, которые не могли быть родовыми без нарушения существующего кода.Почему Java (но не .NET) неспособна разместить дженерики без необходимости использования сырых типов/типов стирания?
Дженерики были также представлены в .NET в какой-то момент по дороге, но эта функция была реализована таким образом, что она не полагается на сырые типы или стирание типа (и если это так, то это делается так, прозрачный для пользователя). Таким образом, существующие API остались неизменными (например, код в пространстве имен System.Collections) и были введены новые общие API (например, код в пространстве имен System.Collections.Generic).
Так как же Java-генераторы, в отличие от .NET-дженериков, требуют сырых типов/типов стирания?
Кроме того. .Net заменил существующие контейнеры родовыми версиями в другом пространстве имен. Код, который хочет использовать их, должен быть перенесен практически сразу. Способ Java позволил им просто сделать существующие контейнеры родовыми, поэтому портирование по частям означает просто случайное подавление и предупреждение. –
@SebastianRedl: Это в основном расширение дженериков, являющихся функцией времени компиляции. – SLaks
Хотя .NET изменил язык байт-кода, я не думаю, что Java обязательно должен был бы сделать это, чтобы универсальные объекты могли знать их тип. Я думаю, было бы возможно, чтобы каждый экземпляр общего объекта содержал одно или несколько полей, сгенерированных компилятором, обозначающее комбинацию типов, с которыми был создан экземпляр экземпляра, и для компилятора сгенерированный код, который, при необходимости, проверял бы такие поля. Я думаю, что большая проблема заключалась бы в том, что если 'ArrayList' были реализованы как любой тип, отличный от' ArrayList' ... –
supercat