Java:自动装箱和铸造有什么区别?
这个问题是关于“为什么自动装箱在Java中使某些调用模糊不清?”
但通读答案,有一些参考铸造,我不知道我完全理解的差异。
有人可以提供一个简单的解释?
拳击是当你将一个基本types转换为一个引用types时,取消打击是相反的。 当您希望将一种types视为另一种types时,即基本types和引用types之间进行投射,这意味着隐式或显式装箱操作。 是否需要明确是一种语言function。
cast和boxing / unboxing都与types和明显的(或真实的)转换有关,但是boxing / unboxing是特定于原始types和它们相应的包装types之间的关系的,而cast则是types的显式或隐式变化更一般的意义。
铸造是一个具有两个相关 – 但不同含义的通用术语:
-
将一种types的值视为另一种types的值。 这第一个用法的两个例子是:
1.1。 考虑到
B
类扩展了A
类,可以通过写((A) myB)
来请求myB
一个实例作为A
的一个实例对待,只要A
实例的引用可以出现。 这实际上并不产生A
的新实例。1.2。 Pre-Java5集合将所有内容存储为
Object
; 这通常需要您从集合中检索对象后使用强制转换。 例如,如果你已经在一个Map
存储了一个String
,并且需要获取它的长度,你可以写一些像((String) myMap.get(someKey)).length()
String
的length
方法。 同样,这不会导致创build一个新的String
。 -
明确地将一种types转换为另一种(即明确地改变表示)。 第二个用法的例子是在expression式
((int) (float_var + 0.5F))
,通过将浮点variables加0.5(产生一个浮点值)来((int) (float_var + 0.5F))
浮点variables,然后显式地将该值转换为整数。 所得到的整数值(在(int)
cast之后)由另一个值通过内部计算生成。
如果存在超类/子类或接口/实现者关系(上面的意思是1),或者两种types是原始数字types(意思是2),则可以进行转换。 你可能会看到“扩大”和“缩小”的更多细节。
拳击是指在容器对象中包装基本types,通常只有当你必须有一个对象(例如在一个集合中存储一个值)时才会这样做。 原始types和包装types成对出现:
int Integer long Long boolean Boolean ... ...
拆箱只是意味着从其对象包装中检索原始值。
从Java5开始,当您编写一个使用原始值的expression式(需要相应的包装器types)时(例如将整数放入集合中),编译器会自动滑入实际包装该原始值的代码中。 同样,它将为您提供解包代码。
所以,而不是写(在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;
并且装箱/拆箱代码由编译器插入。
List<String> list = (List<String>)object;
是一个演员。
void doSomething(Integer i) { ... } ... doSomeething(5);
是自动装箱。
Integer getSomething(); ... int i = getSomething();
是自动拆箱。
在Java 5中引入了自动装箱function,以防止代码如下:
map.put("ABC", new Integer(5)); map.put("DEF", new Integer(6));
你现在可以说:
map.put("ABC", 5);
虽然它更容易 – 如果你不完全确定你在做什么,它有一些缺陷。
拳击在一个容器内包装一个值,例如一个Integer对象内的一个int原始值
铸造只是如何看待types。
前者产生另一种价值,后者只是修改如何处理已有的价值
除了原始types之间的转换实际上修改了它们的表示。 (这不是更清楚吗?)
拳击和拆箱是一种在Java中进行强制转换的types,您可以从原语转换为其包装类或反转,例如布尔转换为布尔(box)或布尔转换为布尔(unbox)。
Java中的types转换,例如:
-
一个身份转换(§5.1.1)string转换为string
-
一个拓宽的原始转换(§5.1.2)字节到int
-
一个缩小的原始转换(§5.1.3)int到字节
-
一个扩大的参考转换(§5.1.5)整数到数字
-
一个缩小的参考转换(§5.1.6)数字到整数
-
整数转换(§5.1.7)int整数
-
一个拆箱转换(§5.1.8)。 整数到整数
自动装箱或autounboxing发生在编译器为您进行装箱/拆箱转换时(它不会在源代码中显示为转换expression式),例如,请参阅您提到的问题。
在以下情况下是否可以应用自动装箱和拆箱?
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");