Java:自动装箱和铸造有什么区别?

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

但通读答案,有一些参考铸造,我不知道我完全理解的差异。

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

拳击是当你将一个基本types转换为一个引用types时,取消打击是相反的。 当您希望将一种types视为另一种types时,即基本types和引用types之间进行投射,这意味着隐式或显式装箱操作。 是否需要明确是一种语言function。

cast和boxing / unboxing都与types和明显的(或真实的)转换有关,但是boxing / unboxing是特定于原始types和它们相应的包装types之间的关系的,而cast则是types的显式或隐式变化更一般的意义。

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

  1. 将一种types的值视为另一种types的值。 这第一个用法的两个例子是:

    1.1。 考虑到B类扩展了A类,可以通过写((A) myB)来请求myB一个实例作为A的一个实例对待,只要A实例的引用可以出现。 这实际上并不产生A的新实例。

    1.2。 Pre-Java5集合将所有内容存储为Object ; 这通常需要您从集合中检索对象后使用强制转换。 例如,如果你已经在一个Map存储了一个String ,并且需要获取它的长度,你可以写一些像((String) myMap.get(someKey)).length() Stringlength方法。 同样,这不会导致创build一个新的String

  2. 明确地一种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");