这个问题 是关于“为什么自动装箱会使 Java 中的某些调用变得不明确?”

但通读答案,有很多关于选角的参考,我不确定我是否完全理解其中的区别。

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

有帮助吗?

解决方案

拳击是当转换一个基本类型引用类型的,未拳击是反向。铸造是当你想要一个类型被视为另一种类型,基本类型和引用类型之间,这意味着一个隐性或显性的装箱操作。是否需要要明确是语言功能。

其他提示

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

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

  1. 处理一种类型的值 仿佛 它是另一种类型的值。第一种用法的两个例子是:

    1.1.鉴于该类 B 扩展类 A, ,你可以要求 myB 的一个实例 B 被视为一个实例 A 通过写作 ((A) myB) 无论何时引用实例 A 可能会出现。这实际上并不会产生一个新实例 A.

    1.2.Java5 之前的集合将所有内容存储为 Object;这通常要求您在从集合中检索对象后使用强制转换。例如,如果您存储了 String 在一个 Map 并且需要得到它的长度,你会写类似的东西 ((String) myMap.get(someKey)).length() 需要强制转换才能调用 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;

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

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

是铸件。

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

是自动装箱。

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 中的一种类型转换,您可以从原语转换为其包装类或反之,例如布尔值到布尔值(装箱),或布尔值到布尔值(拆箱)。

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

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

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

  • 狭窄的原始转换(§5.1.3)int到字节

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

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

  • 拳击转换(§5.1.7)int到整数

  • 拆箱转换(第 5.1.8 节)。整数转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");  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top