Java不允许在通用数据结构中使用基元类型。例如。的ArrayList< INT>不被允许。原因是,原始类型不能直接转换为Object。但是Java 1.5确实支持自动装箱,而包装类在通用数据结构中工作。那么为什么编译器无法将其自动装入ArrayList< Integer>?为什么这不起作用还有其他原因吗?
答案 0 :(得分:6)
据我了解,您提议的ArrayList<int>
与ArrayList<Integer>
相同。是对的吗? (换句话说,在内部它仍然存储一个整数;并且每次你输入或取出它时,它会自动打包/取消装箱,但自动装箱/自动装箱已经为ArrayList<Integer>
执行了此操作。)
如果它是相同的,那么我不明白具有重复语法<int>
的效用是什么意思与<Integer>
相同。 (实际上它会引入其他问题,因为例如int[]
与Integer[]
不是同一个运行时类型,所以如果你有T[]
,T
是{{1这是什么意思?)
答案 1 :(得分:1)
答案 2 :(得分:1)
问题在于性能。对于每个get()
/ set()
方法,在列表中,JVM必须分别对所提到的方法的相应值进行取消装箱/取消。请记住,autoboxing采用原始类型并将它们包装成Object
,反之亦然,如Autoboxing所述:
最后,还有与拳击有关的表现成本 取消装箱,即使它是自动完成的。
我认为他们希望List能够一起完成简单操作并缓解性能。
答案 3 :(得分:0)
我认为没有任何技术原因可以像你说的那样完成,但总会考虑界面:例如,如果你自动将ArrayList<int>
类型的对象转换为ArrayList<Integer>
,你在界面规范方面失去了一些明确性:事实上,ArrayList实际存储对象而不是原语是不太明显的。
我的理解是,autoboxing更多的是参数类型的兼容性和灵活性,而不是简单地说“int”而不是“Integer”。 Java并不是因为它对简洁性的痴迷而闻名......
一个小PS:我不认为在“autobox ArrayLint<int>
到ArrayList<Integer>
”这个问题在技术上是正确的,因为你实际上并没有在对象“盒子”中包装任何东西 - 您实际上只是将类型名称ArrayList<int>
转换为“实际”类型ArrayList<Integer>
答案 4 :(得分:0)
我很高兴这是不可能的,因为int使用的内存比Integer少得多,而且速度也快得多。因此,它迫使我思考是否可以使用Collection<Integer>
(在业务应用程序中很多时候没关系,但在其他应用程序中却没有)。
如果Collection<int>
可行且有效,我会更高兴,但事实并非如此。
答案 5 :(得分:-1)
我认为这不是什么问题 - 你有什么具体案例,这会以某种方式限制你吗?顺便说一句,int和Integer之间存在差异,而对象可以为null,而原始类型则不能。