Java集合仅存储对象,而不存储原始类型。但是,我们可以存储包装器类。
为什么会有这种约束?
这是一个Java设计决策,有人认为这是一个错误。容器需要对象,而基元不是从对象派生的。
这是.NET设计人员从JVM中学到的地方,并实现了值类型和泛型,因此在许多情况下都无需装箱。在CLR中,通用容器可以将值类型存储为基础容器结构的一部分。
Java选择在编译器中100%添加通用支持,而没有JVM的支持。JVM本身就是这样,它不支持“非对象”对象。Java泛型允许你假装没有包装器,但是你仍然要付出拳击的性能代价。这对于某些类的程序很重要。
装箱是一种技术折衷,我认为这是泄漏到语言中的实现细节。自动装箱是不错的语法糖,但仍然会降低性能。如果有的话,我希望编译器在自动装箱时发出警告。(据我所知,现在也许是在2010年,我写了这个答案)。
关于拳击的一个很好的解释:为什么有些语言需要装箱和拆箱?
以及对Java泛型的批评: 为什么有人声称Java的泛型实现不好?
在Java的辩护中,很容易向后看和批评。JVM经受了时间的考验,并且在许多方面都是不错的设计。