26

这个问题是关于“为什么自动装箱在 Java 中使某些调用模棱两可?”

但是通读答案,有许多关于铸造的参考资料,我不确定我是否完全理解其中的区别。

有人可以提供一个简单的解释吗?

4

7 回答 7

40

装箱是将原始类型转换为引用类型时,反装箱是相反的。强制转换是当您希望将一种类型视为另一种类型时,在原始类型和引用类型之间,这意味着隐式或显式装箱操作。是否需要显式是一种语言特性。

于 2009-02-01T22:01:47.713 回答
28

强制转换和装箱/拆箱都与类型和表观(或实际)转换有关,但装箱/拆箱特定于原始类型与其对应的包装器类型之间的关系,而强制转换是类型显式或隐式更改的术语更一般的意义。

铸造是一个通用术语,具有两个相关但不同的含义:

  1. 将一种类型的值视为另一种类型的值。第一个用法的两个示例是:

    1.1。鉴于该类B扩展了类,您可以通过在可能出现对实例的引用的任何地方写入A来请求myB将实例B视为实例。这实际上不会产生.A((A) myB)AA

    1.2. Java5 之前的集合将所有内容存储为Object; 这通常要求您在从集合中检索对象后使用强制转换。例如,如果您已将 a 存储String在 a 中Map并需要获取其长度,则您将编写类似((String) myMap.get(someKey)).length()where 需要强制转换的内容以length调用String. 同样,这不会导致String创建新的。

  2. 将一种类型显式转换为另一种类型(即显式更改表示形式)。第二种用法的一个例子是在表达式((int) (float_var + 0.5F))中通过添加 0.5(产生一个浮点值)来舍入一个浮点变量,然后将该值显式转换为整数。生成的整数值(转换后(int))是通过内部计算从另一个值产生的。

当存在超类/子类或接口/实现者关系(意思是上面的 1)或者当这两种类型是原始数字类型(意思是 2)时,可以进行强制转换。您可以查看“扩大”和“缩小”以获取更多详细信息。

装箱是指将原始类型包装在容器对象中,通常仅在您必须拥有一个对象时才进行(例如,将值存储在集合中)。原始类型和包装类型成对出现:

int      Integer
long     Long
boolean  Boolean
...      ...

拆箱只是意味着从其对象包装器中检索原始值。

从 Java5 开始,当您编写使用原始值的表达式时,需要相应的包装类型(例如将整数放入集合中),编译器会自动插入实际包装该原始值的代码。同样,它将为您提供解包代码。

所以不要写(在Java5之前)这样的东西:

Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;

你可以写:

Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

并且装箱/拆箱代码由编译器插入。

于 2009-02-01T22:46:03.257 回答
8
List<String> list = (List<String>)object;

是演员表。

void doSomething(Integer i) { ... }
...
doSomeething(5);

是自动装箱。

Integer getSomething();
...
int i = getSomething();

是自动拆箱。

于 2009-02-01T21:56:58.567 回答
4

Java 5 中引入了自动装箱以防止以下代码:

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

你现在可以说:

map.put("ABC", 5);

虽然它更容易 - 如果您不完全确定自己在做什么,它确实有一些陷阱。

于 2009-02-01T22:01:25.483 回答
0

装箱是将值包装在容器内,例如 Integer 对象内的 int 原始值

铸造只是如何看待类型。

前者产生另一种价值,后者只是修改如何对待已经存在的价值

除了原始类型之间的转换实际上会修改它们的表示。(这并没有让它更清楚吗?)

于 2009-02-01T22:04:44.713 回答
0

装箱和拆箱是Java 中的一种类型转换,您可以从原始类型转换为它的包装类或反之,例如布尔转换为布尔(框),或布尔转换为布尔(拆箱)。

Java 中的类型转换,例如:

  • 身份转换(第 5.1.1 节)字符串到字符串

  • 扩大原始转换(§5.1.2)字节到int

  • 一个缩小的原始转换 (§5.1.3) int 到 byte

  • 扩大参考转换(§5.1.5)整数到数字

  • 缩小参考转换(§5.1.6)数字到整数

  • 拳击转换 (§5.1.7) int 到 Integer

  • 拆箱转换(§5.1.8)。整数到 int

自动装箱或自动拆箱发生在编译器为您进行装箱/拆箱转换时(它没有明确出现在源代码中作为强制转换表达式),例如,请参阅您提到的问题。

于 2009-02-01T22:11:41.860 回答
0

自动装箱和拆箱可以应用于以下情况吗?

Long one = 10;
long two = 15;
Long three = 20;

if(one == three) //will this be unboxed or do we need to put a explicit
                 //condition like if(one.intValue() == three.intValue()) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  


if(one == two) //will this be unboxed or do we need to put a explicit
               //condition like if(one.intValue() == two) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  
于 2013-01-07T03:23:16.033 回答