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