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

Java:What';自动装箱和铸造有什么区别?,java,casting,autoboxing,Java,Casting,Autoboxing,是关于“为什么自动装箱在Java中使一些调用不明确?” 但是通过阅读答案,有很多关于演员的参考资料,我不确定我是否完全理解其中的区别 有人能提供一个简单的解释吗 List<String> list = (List<String>)object; 是自动装箱 Integer getSomething(); ... int i = getSomething(); 是自动取消装箱。Java 5中引入了自动装箱,以防止出现以下代码: map.put("ABC", new In

是关于“为什么自动装箱在Java中使一些调用不明确?”

但是通过阅读答案,有很多关于演员的参考资料,我不确定我是否完全理解其中的区别

有人能提供一个简单的解释吗

List<String> list = (List<String>)object;
是自动装箱

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

是自动取消装箱。

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

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
你现在可以说:

map.put("ABC", 5);

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

装箱是指将基元类型转换为引用类型,而取消装箱则相反。强制转换是指在基元类型和引用类型之间,希望将一个类型视为另一个类型,这意味着隐式或显式装箱操作。它是否需要明确是一种语言特性

装箱是将值包装在容器中,例如整数对象中的int基元值

铸造只是如何看待类型

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


除了在基元类型之间进行强制转换之外,实际上会修改它们的表示形式。(这并没有让它更清楚,是吗?

装箱和取消装箱是Java中的一种类型转换,您可以从一个原语转换到它的包装类或其逆类,例如布尔到布尔(box),或布尔到布尔(unbox)

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

  • 身份转换(§5.1.1) 串对串

  • 扩大原语转换(§5.1.2) 字节到整数

  • 缩小原语转换(§5.1.3) 整数到字节

  • 拓宽参考转换(§5.1.5) 整数对数字

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

  • 装箱转换(§5.1.7) 整数到整数

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


自动装箱或自动取消装箱发生在编译器为您执行装箱/取消装箱转换时(它在源代码中没有明确显示为强制转换表达式),例如,请参见您提到的问题。

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

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

  • 将一种类型的值视为另一种类型的值。第一种用法的两个例子是:

    1.1。考虑到类
    B
    扩展了类
    A
    ,您可以通过编写
    ((A)myB)
    来请求
    myB
    B
    的实例视为
    A
    的实例。这实际上不会生成
    a
    的新实例

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

  • 显式将一种类型转换为另一种类型(即显式更改表示)。第二种用法的一个例子是表达式
    ((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;
    
    Map myMap=newhashmap();
    ...
    myMap.put(someKey,3);
    ...
    int nextValue=myMap.get(someKey)+1;
    

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

    自动装箱和取消装箱是否可以应用于以下情况

    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");  
    

    这里的关键是Integer是一种引用类型,int(或数字5)是一种值类型/原语。如果拼写正确,则第二个示例是自动装箱。。。。。看起来很有用我相信这是正确的答案,但我不认为装箱/拆箱应该被描述为“转换”。更清楚的说法是,原语被包装在一个等价的对象中。@Unlaw Programmer:我同意,这会更精确。有例子吗@Faizan装箱(顾名思义)指的是使用包装器,即
    Integer
    而不是
    int
    。下面的答案实际上提供了
    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");