这个问题是关于“为什么自动装箱在 Java 中使某些调用模棱两可?”
但是通读答案,有许多关于铸造的参考资料,我不确定我是否完全理解其中的区别。
有人可以提供一个简单的解释吗?
装箱是将原始类型转换为引用类型时,反装箱是相反的。强制转换是当您希望将一种类型视为另一种类型时,在原始类型和引用类型之间,这意味着隐式或显式装箱操作。是否需要显式是一种语言特性。
强制转换和装箱/拆箱都与类型和表观(或实际)转换有关,但装箱/拆箱特定于原始类型与其对应的包装器类型之间的关系,而强制转换是类型显式或隐式更改的术语更一般的意义。
铸造是一个通用术语,具有两个相关但不同的含义:
将一种类型的值视为另一种类型的值。第一个用法的两个示例是:
1.1。鉴于该类B
扩展了类,您可以通过在可能出现对实例的引用的任何地方写入A
来请求myB
将实例B
视为实例。这实际上不会产生.A
((A) myB)
A
A
1.2. Java5 之前的集合将所有内容存储为Object
; 这通常要求您在从集合中检索对象后使用强制转换。例如,如果您已将 a 存储String
在 a 中Map
并需要获取其长度,则您将编写类似((String) myMap.get(someKey)).length()
where 需要强制转换的内容以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);
虽然它更容易 - 如果您不完全确定自己在做什么,它确实有一些陷阱。
装箱是将值包装在容器内,例如 Integer 对象内的 int 原始值
铸造只是如何看待类型。
前者产生另一种价值,后者只是修改如何对待已经存在的价值
除了原始类型之间的转换实际上会修改它们的表示。(这并没有让它更清楚吗?)
装箱和拆箱是Java 中的一种类型转换,您可以从原始类型转换为它的包装类或反之,例如布尔转换为布尔(框),或布尔转换为布尔(拆箱)。
Java 中的类型转换,例如:
身份转换(第 5.1.1 节)字符串到字符串
扩大原始转换(§5.1.2)字节到int
一个缩小的原始转换 (§5.1.3) int 到 byte
扩大参考转换(§5.1.5)整数到数字
缩小参考转换(§5.1.6)数字到整数
拳击转换 (§5.1.7) int 到 Integer
拆箱转换(§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");