7

Java 不允许在通用数据结构中使用原始类型。例如,不允许使用 ArrayList<int>。原因是,原始类型不能直接转换为 Object。然而,Java 1.5 确实支持自动装箱,并且包装类在通用数据结构中工作。那么为什么编译器不能将它自动装箱到 ArrayList<Integer> 呢?还有其他原因导致这不起作用吗?

4

6 回答 6

7

据我了解,您的提议ArrayList<int>将与ArrayList<Integer>. 是对的吗?(换句话说,它在内部仍然存储一个整数;每次你放入或取出东西时,它都会自动装箱/拆箱,但自动装箱/自动拆箱已经为ArrayList<Integer>.)

如果它是相同的,那么我不明白重复语法的用处是什么,<int>因为它与<Integer>. (实际上它会引入额外的问题,因为 exampleint[]与运行时类型不同Integer[],所以如果你有T[], 和Tis int,那意味着什么?)

于 2011-08-12T09:04:28.077 回答
2

泛型类型信息在运行时被擦除。检查此链接。泛型与编译时检查有关,而不是运行时检查。自动装箱和拆箱是运行时操作。请参阅链接。这就是自动装箱不适用于泛型的原因。

于 2011-08-12T07:11:59.040 回答
1

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

最后,与装箱和拆箱相关的性能成本,即使它是自动完成的。

我认为他们想要一个 List 来做简单的操作和减轻性能。

于 2011-08-12T07:24:16.080 回答
0

我不认为有任何技术原因不能像你说的那样做,但总是有接口考虑:例如,如果你自动将类型的对象转换ArrayList<int>为 be ArrayList<Integer>,你在接口规范方面失去了一些明确性:它ArrayList 实际上存储对象而不是原语,这一点不太明显。

我的理解是,自动装箱更多地是为了参数类型的兼容性和灵活性,而不是为了便于说“int”而不是“Integer”。Java 并不完全以其对简洁的痴迷而闻名......

一个小 PS:我认为说“autobox ArrayLint<int>to ArrayList<Integer>”在技术上是不正确的,因为您实际上并没有将任何东西包装在对象“box”中——您实际上只是将类型名转换ArrayList<int>为“实际”类型ArrayList<Integer>

于 2011-08-12T06:59:19.520 回答
0

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

于 2011-08-12T07:08:53.427 回答
-1

我认为这不是任何问题——你有什么具体的例子吗?这会以某种方式限制你吗?顺便说一句,int 和 Integer 之间存在差异,而对象可以为 null 而原始类型不能。

于 2011-08-12T06:54:59.413 回答