gpt4 book ai didi

java - 为什么我们在 Java 中使用自动装箱和拆箱?

转载 作者:IT老高 更新时间:2023-10-28 13:50:49 25 4
gpt4 key购买 nike

Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing.

那么为什么我们需要它以及为什么我们在 Java 中使用自动装箱和拆箱?

最佳答案

需要一些上下文才能完全理解其背后的主要原因。

基元与类

Java 中的原始变量包含值(整数、 double 浮点二进制数等)。因为these values may have different lengths ,包含它们的变量也可能有不同的长度(考虑 floatdouble )。

另一方面,类变量包含对实例的引用。在许多语言中,引用通常被实现为指针(或与指针非常相似的东西)。这些东西通常具有相同的大小,无论它们引用的实例的大小如何(ObjectStringInteger 等)。

类变量的这个属性使得它们包含的引用可以互换(在一定程度上)。这使我们能够进行我们所说的替换:广义上讲, to use an instance of a particular type as an instance of another, related type (例如,使用 String 作为 Object)。

原始变量不能以同样的方式互换,既不能相互互换,也不能与Object 互换。 .最明显的原因(但不是唯一的原因)是它们的尺寸差异。这使得原始类型在这方面不方便,但我们仍然需要在语言中使用它们(原因主要归结为性能)。

泛型和类型删除

泛型类型是具有一个或多个类型参数的类型(确切的数字称为泛型参数)。例如,泛型类型定义 List<T>有一个类型参数 T , 可以是 Object (生产具体类型 List<Object>),String ( List<String> ), Integer ( List<Integer> ) 等等。

泛型比非泛型复杂得多。当它们被引入 Java 时(在其初始版本之后),为了避免对 JVM 进行彻底的更改并可能破坏与旧二进制文件的兼容性,Java 的创建者决定以侵入性最小的方式实现泛型类型: List<T> 的所有具体类型实际上,被编译为(二进制等价物)List<Object> (对于其他类型,界限可能不是 Object ,但你明白了)。 在这个过程中会丢失泛型和类型参数信息,这就是我们称之为type erasure的原因。 .

将两者放在一起

现在的问题是上述现实的结合:如果 List<T>变成 List<Object>在所有情况下,然后 T必须始终是可以直接分配给 Object 的类型。其他任何事情都不允许。因为,正如我们之前所说,int , floatdouble不能与 Object 互换, 不能有 List<int> , List<float>List<double> (除非 JVM 中存在更复杂的泛型实现)。

但 Java 提供像 Integer 这样的类型, FloatDouble它将这些原语包装在类实例中,使它们可以有效地替换为 Object ,因此允许泛型类型间接使用原语(因为您可以拥有 List<Integer>List<Float>List<Double> 等等)。 p>

创建 Integer 的过程来自 int , 一个 Float来自 float以此类推,称为 boxing 。反过来称为拆箱。因为每次您想将它们用作 Object 时都必须对它们进行装箱。不方便,在某些情况下语言会自动执行此操作 - that's called autoboxing .

关于java - 为什么我们在 Java 中使用自动装箱和拆箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com