为什么不为泛型自动封装Java原始类型?

时间:2011-08-12 06:49:39

标签: java generics autoboxing

Java不允许在通用数据结构中使用基元类型。例如。的ArrayList< INT>不被允许。原因是,原始类型不能直接转换为Object。但是Java 1.5确实支持自动装箱,而包装类在通用数据结构中工作。那么为什么编译器无法将其自动装入ArrayList< Integer>?为什么这不起作用还有其他原因吗?

6 个答案:

答案 0 :(得分:6)

据我了解,您提议的ArrayList<int>ArrayList<Integer>相同。是对的吗? (换句话说,在内部它仍然存储一个整数;并且每次你输入或取出它时,它会自动打包/取消装箱,但自动装箱/自动装箱已经为ArrayList<Integer>执行了此操作。)

如果它是相同的,那么我不明白具有重复语法<int>的效用是什么意思与<Integer>相同。 (实际上它会引入其他问题,因为例如int[]Integer[]不是同一个运行时类型,所以如果你有T[]T是{{1这是什么意思?)

答案 1 :(得分:1)

通用类型信息在运行时被删除。检查此link。泛型更多地与编译时间检查有关,而不是运行时检查。自动装箱和拆箱是运行时操作。请参阅link。这就是autoboxing不适用于Generics的原因。

答案 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,而原始类型则不能。