题
解决方案
拳击是当转换一个基本类型引用类型的,未拳击是反向。铸造是当你想要一个类型被视为另一种类型,基本类型和引用类型之间,这意味着一个隐性或显性的装箱操作。是否需要要明确是语言功能。
其他提示
强制转换和装箱/拆箱都与类型和表观(或实际)转换有关,但装箱/拆箱特定于基元类型与其相应的包装类型之间的关系,而强制转换是显式或隐式类型更改的术语。更一般的意义。
铸件 是一个通用术语,具有两个相关但不同的含义:
处理一种类型的值 仿佛 它是另一种类型的值。第一种用法的两个例子是:
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
待创建。明确地 转换 一种类型转换为另一种类型(即明确改变表示)。第二种用法的一个例子是表达式
((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");