说一个类型是"盒装"是什么意思?

Nic*_*ner 44 java autoboxing types type-systems terminology

我听说在某些语言中被称为"盒装"的类型.

在Java中,我听说过"autoboxing".这是什么?它是否有类型的包装类?如果我使用盒装或非盒装类型,我的代码会如何变化?

Eri*_* J. 59

某些数据类型被视为"原始",这意味着它们不会被视为对象,也不具有对象的属性.

在大多数平台上,整数和字符是原始类型但可以装箱的类型的示例.

拳击意味着将它们包裹在一个对象中,以便它们具有对象的行为.

确切的含义和行为取决于您使用的语言.有些语言(比如Smalltalk ......至少在我这样做的时候回来......)不允许任何原始类型并认为所有东西都是一个对象,但是有一个与之相关的性能损失,因为最后当天,处理器需要使用原始数字和原始内存来完成有用的工作.如果要添加两个已装箱的整数,例如,在幕后将它们"拆箱"为基本类型,则会添加数字,然后将它们装箱回新的整数.


TM.*_*TM. 18

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
Run Code Online (Sandbox Code Playgroud)

没有自动装箱的旧版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
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下您仍需要手动执行操作.例如,假设您有一个包含两个方法的类,如下所示:

assertEquals(int a, int b);
assertEquals(Object a, Object b)
Run Code Online (Sandbox Code Playgroud)

现在,如果您尝试这样做:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile
Run Code Online (Sandbox Code Playgroud)

这不工作的原因是因为它无法弄清楚它是否应该拆箱a到一个int或箱bInteger.因此,应该调用哪个方法签名是不明确的.要解决此问题,您可以执行以下操作之一:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 12

是的,装箱意味着采用值类型并将其包装在引用类型中.由于java引入了自动装箱,你可以这样做:

void foo(Object bar) {}
//...
    foo(1);
Run Code Online (Sandbox Code Playgroud)

并且java会自动将int 1转换为Integer.在以前的版本中,您必须这样做:

foo(new Integer(1));
Run Code Online (Sandbox Code Playgroud)

在使用泛型时,自动装箱在java中最有用,因为你不能使用带有泛型的原语,所以要在列表中存储整数,你必须制作一个List<Integer>并将整数放入列表框中.


Pas*_*uoq 5

装箱类型意味着值被分配在堆上的块中并通过指针引用。这有利于运行时实现的一致性(它使得更容易拥有通用函数等),但代价是额外的间接寻址。