为什么不为泛型自动装箱Java基本类型?

问题描述 投票:7回答:6

Java不允许在通用数据结构中使用基本类型。例如。不允许使用ArrayList 。原因是,原始类型不能直接转换为Object。但是,Java 1.5确实支持自动装箱,并且包装器类在通用数据结构中工作。那么,为什么编译器不能自动将其装箱到ArrayList ?还有其他原因导致其无法正常工作吗?

java generics autoboxing
6个回答
7
投票

据我所知,您建议的ArrayList<int>将与ArrayList<Integer>相同。那正确吗? (换句话说,它在内部仍然存储一个Integer;每次将某物放入或取出时,它都会自动将其装箱/拆箱,但是对于ArrayList<Integer>,自动装箱/自动拆箱已经可以了。)

如果相同,那么当我与<int>表示相同的意思时,我不明白使用重复语法<Integer>的实用性是什么。 (实际上,这会带来其他问题,因为例如int[]Integer[]是不同的运行时类型,所以如果您有T[],而Tint,那意味着什么?) >


2
投票

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


1
投票

问题将出在性能上。对于列表中的每个get() / set()方法,JVM都必须分别对所提到的方法取消装箱/装箱。请记住,自动装箱采用原始类型并将其包装到Object中,反之亦然,如Autoboxing中所述:


0
投票

我不认为有任何技术原因无法像您说的那样完成,但是始终有接口注意事项:例如,如果您将类型为ArrayList<int>的对象自动转换为ArrayList<Integer>,则会失去一些明确性就接口规范而言:ArrayList实际上存储的是objects,


0
投票

我很高兴这是不可能的,因为int使用的内存比Integer少得多,而且速度也快得多。因此,这迫使我思考是否可以使用Collection<Integer>(在商务应用程序中很多次都可以,但是在其他应用程序中则不是)。如果Collection<int>可行且高效,我会更加高兴,但事实并非如此。


-1
投票

我不认为这是任何问题-您是否有具体情况在某种程度上限制了您?顺便说一句,在int和Integer之间存在区别,而对象可以为null而原始类型不能。

© www.soinside.com 2019 - 2024. All rights reserved.