说一个类型是“盒装”是什么意思?
2022-08-31 15:20:18
我听说过在某些语言中被称为“盒装”的类型。
在Java中,我听说过“自动装箱”。这是怎麽?它是否具有类型的包装类?如果我使用盒装或非装箱类型,我的代码将如何更改?
我听说过在某些语言中被称为“盒装”的类型。
在Java中,我听说过“自动装箱”。这是怎麽?它是否具有类型的包装类?如果我使用盒装或非装箱类型,我的代码将如何更改?
某些数据类型被视为“基元”,这意味着它们不被视为对象,也不具有对象的属性。
在大多数平台上,整数和字符是基元但可以装箱的类型的示例。
装箱意味着将它们包装在一个对象中,以便它们具有对象的行为。
确切的含义和行为取决于您使用的语言。某些语言(如 Smalltalk...至少在我做这件事的时候哇不允许任何基元类型,并将所有内容视为对象,但与此相关的性能会受到损害,因为归根结底,处理器需要使用原始数字和原始内存来执行有用的工作。如果要添加两个已装箱的整数,例如,在后台将它们“解装”为基元类型,则添加数字,然后将其装箱回新整数。
有关 Java 的更具体信息:
自动装箱允许java自动将诸如和之类的内容转换为其对象版本,并且在大多数情况下。它还允许相反的情况发生。boolean
int
Boolean
Integer
例如:
int a = 3; // no boxing is happening
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3
int c = b; // these same versions also automatically convert Integer 3 to int 3
没有自动装箱的旧版本的java将需要以下代码来执行相同的操作:
int a = 3; // works the same
Integer b = new Integer(3); //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive
但是,在某些情况下,您仍然必须手动执行操作。例如,假设您有一个具有两个方法的类,如下所示:
assertEquals(int a, int b);
assertEquals(Object a, Object b)
现在,如果您尝试执行此操作:
Integer a = 3;
int b = 3;
assertEquals(a, b); // this will not compile
这不起作用的原因是因为它无法确定是否应该将 box 拆箱到 或 box 到 .因此,应该调用哪个方法签名是模棱两可的。要解决此问题,您可以执行以下操作之一:a
int
b
Integer
assertEquals((int) a, b);
assertEquals(a, (Integer) b);