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

时间:2009-02-01 21:53:39

标签: java casting autoboxing

This question是关于“为什么autoboxing会在Java中使一些调用变得模棱两可?”

但是通过阅读答案,有很多关于演员的内容,我不确定我是否完全理解这些差异。

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

7 个答案:

答案 0 :(得分:34)

拳击是指将原始类型转换为引用类型时,反拳击是相反的。转换是指您希望将一种类型视为另一种类型,在基本类型和引用类型之间,这意味着隐式或显式装箱操作。是否需要明确是语言功能。

答案 1 :(得分:24)

转换和装箱/拆箱都与类型和明显(或实际)转换有关,但装箱/拆箱特定于基本类型与其对应的包装类型之间的关系,而转换是显式或隐式更改的术语在一般意义上的类型。

投射是一个通用术语,有两个相关但不同的含义:

  1. 处理一种类型的值,就好像它是另一种类型的值。第一个用法的两个例子是:

    1.1。鉴于类B扩展了类A,您可以通过编写{{1}来要求将myB B的实例视为A的实例。无论何处出现对((A) myB)实例的引用。这实际上并不会产生A的新实例。

    1.2。 Pre-Java5集合将所有内容存储为A;这通常要求您在从集合中检索对象后使用强制转换。例如,如果您在Object中存储了String并且需要获取其长度,那么您可以编写类似Map的内容,其中需要强制转换才能调用{ {1}} ((String) myMap.get(someKey)).length()的方法。同样,这不会导致创建新的length

  2. 明确转换一种类型(即显式更改表示)。第二种用法的一个例子是在表达式String中,它通过添加0.5(产生浮点值)然后显式地将该值转换为整数来舍入浮点变量。生成的整数值(在String强制转换后)通过内部计算从其他值生成

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

    Boxing 是指在容器对象中包装基本类型,通常只在必须有对象时才会进行(例如,在集合中存储值)。原始类型和包装类型成对出现:

    ((int) (float_var + 0.5F))

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

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

    所以不要写(在Java5之前)像:

    (int)

    你可以写:

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

    并且编译器会插入装箱/取消装箱代码。

答案 2 :(得分:8)

List<String> list = (List<String>)object;

是演员。

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

是自动装箱。

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

是自动取消装箱。

答案 3 :(得分:4)

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

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

你现在可以说:

map.put("ABC", 5);

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

答案 4 :(得分:0)

Boxing将一个值包装在容器中,例如Integer对象中的int原始值

投射就是如何看待类型。

前者产生另一种值,后者只是修改了如何处理已存在的值

除了在原始类型之间进行转换外,实际上会修改它们的表示。 (这不会让它更清楚吗?)

答案 5 :(得分:0)

Boxing和unboxing是Java中的一种类型的转换,您可以从基元转换为其包装类或反转,例如, boolean to Boolean(box),或Boolean to boolean(unbox)。

Java中的强制类型转换,例如:

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

  • 扩大原始转换(第5.1.2节) byte to int

  • 缩小基元转换(第5.1.3节) int到byte

  • 扩大参考转换(第5.1.5节) 数字整数

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

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

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

当编译器为您执行装箱/取消装箱转换时,它会发生自动装箱或自动装箱(它没有明确地在源代码中显示为演员表达式),例如:看到你提到的问题。

答案 6 :(得分: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");