Это было дизайнерское решение Java, и некоторые считают это ошибкой. Контейнеры хотят, чтобы объекты и примитивы не были производными от объекта.
Это то место, которое разработчики .NET извлекли уроки из JVM и реализовали типы значений и обобщения, так что во многих случаях бокс исключается. В CLR универсальные контейнеры могут хранить типы значений как часть базовой структуры контейнера.
Java решила добавить в компилятор общую поддержку на 100% без поддержки JVM. JVM, будучи тем, чем она является, не поддерживает «необъектный» объект. Обобщения Java позволяют вам притвориться, что обертки нет, но вы все равно платите за производительность бокса. Это ВАЖНО для определенных классов программ.
Бокс - это технический компромисс, и я чувствую, что детали реализации просочились в язык. Автобокс является хорошим синтаксическим сахаром, но все же снижает производительность. Во всяком случае, я бы хотел, чтобы компилятор предупредил меня, когда он будет автоматически. (Насколько я знаю, возможно, сейчас я написал этот ответ в 2010 году.)
Хорошее объяснение SO о боксе: Зачем некоторым языкам нужен бокс и распаковка?
И критика обобщений Java: Почему некоторые утверждают, что реализация обобщений Java плохая?
В защиту Java легко оглянуться назад и критиковать. JVM выдержала испытание временем и во многих отношениях является хорошим дизайном.