Насколько я понимаю, причина, по которой в Java существуют необработанные типы и стирание типов, заключается в том, что в то время, когда были введены дженерики, существовали стандартные API, которые нельзя было сделать универсальными без нарушения существующего кода.
Обобщения также были введены в .NET в какой-то момент в будущем, но эта функция была реализована таким образом, что не зависит от необработанных типов или стирания типов (а если и зависит, то таким образом, который является прозрачным для пользователя). ). Таким образом, существующие API остались без изменений (например, код в пространстве имен System.Collections) и были введены новые универсальные API (например, код в пространстве имен System.Collections.Generic).
Так почему же дженерики Java, в отличие от дженериков .NET, требуют необработанных типов/стирания типов?